原型与原型链学习笔记

javascript/jquery

浏览数:479

2019-6-14

原 型:相同对象的共有属性也称作原型

原型链:中所有的对象都是由它的原型对象继承而来。而原型对象自身也是一个对象,它也有自己的原型对象,这样层层上溯,就形成了一个类似链表的结构,这就是原型链

在JS中,不同类型对象都有各自相同类型共有的属性,也有全部对象共有的属性,如果每个对象的属性都单独出来,会非常浪费资源,

var a = new String('a');
var b = new Number(1);
var c = new Boolean(true);
//可以发现,不管是字符串还是数值还是布尔,它们都有toString()属性
a.toString
ƒ toString() { [native code] }

b.toString
ƒ toString() { [native code] }

c.toString
ƒ toString() { [native code] }

所以JS将公共的属性单独出来【如全部对象共用属性valueOf() ,toString()】,JS通过__proto__ 来指向每个类型对象的公共属性。比如,有五个string对象五个number对象,每个对象的值都是不同的,但对象类型都是一样的。

var a = new Number(1)
var b = new Number(2)
//虽然变量a和b的值不同,但是它们共有的属性都是__proto__: Number
console.log(a)
Number {1}
__proto__: Number
[[PrimitiveValue]]: 1

console.log(b)
Number {2}
__proto__: Number
[[PrimitiveValue]]: 2



string对象和number对象都有自己私有属性(指相同对象类型的私有属性),每个对象的__proto__都指向自己相同对象类型的私有属性,相同对象类型的私有属性也有自己的__proto__,它指向的是全部对象共有的属性。__proto__: Number下面的__proto__又指向了全部对象共有的属性。

全部对象共有的属性,没有__proto__属性,它指向的是null,通过下面截图看出普通的object对象__proto__下的属性已经没有__proto__指到其他地方了。

说的直白点就是,所有原型链的__proto__属性,最终都指向的是object对象的__proto__而object对象的__proto__指向的是null。

var 对象 = new 函数()
对象.__proto__ === 对象的构造函数.prototype


// 推论
var number = new Number()
number.__proto__ = Number.prototype

var object = new Object()
object.__proto__ = Object.prototype

var function = new Function()
function.__proto__ = Function.prototype

// 另外,所有函数都是由 Function 构造出来的,所以
Number.__proto__ = Function.prototype // 因为 Number 是函数,是 Function 的实例
Object.__proto__ = Function.prototype // 因为 Object 是函数,是 Function 的实例
Function.__proto__ == Function.prototye // 因为 Function 是函数,是 Function 的实例!

作者:TTTT