Appearance
原型链
对象怎么来的: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
完整原型链
.D-UQOH96.png)