0%
原型链
对象怎么来的:new 出来的。
js
function A() {}
const a = new A()
const b = {}
// 语法糖,相当于 b = new Object()
函数 A 有一个 prototype
属性。
对象 a 有一个属性 __proto__
。
此时 a.__proto__ === A.prototype
。
js
function A() {}
const a = new A()
A.prototype
> {}
a.__proto__
> {}
A.prototype === a.__proto__
> true
proto
来自 Object
,此时可以考虑 proto
的原型关系。
Object
是一个函数,所以 Object
也有一个原型 proto2
。
此时 a
、A
的原型的原型同时指向 Object
的原型 proto2
。
proto2
也是一个对象,但不能来自 Object
,否则无限递归了。js 将其指定为 null
。
由于 Object
同时是一个函数,函数都是由 Function
new 出来的。所以 Object
和 Function
也有原型关系。
js
Object.__proto__ === Function.prototype
true
同时,Object
、proto2
、proto3
之间也存在原型关系。
接下来观察 A
和 Function
,由于 function A() {}
相当于 A = new Function()
,所以 A
、Function
、proto3
之间也存在原型关系。
js
A.__proto__ === Function.prototype
> true
特别地,Function
的隐式原型指向自己的原型。
js
Function.prototype === Function.__proto__
> true