形成对象图的顶部是为了与规范中其他地方设置的期望保持尽可能多的一致性。
必然会出现无法使用正常对象链接的情况,因为您“用完了对象”。
对 JavaScript 的基本了解使我们期望[[Prototype]]ofObject是用于创建Object函数对象的函数的原型属性。
我们希望Functions 是使用Function函数对象创建的,所以...
Object.__proto__ === Function.prototype
因为我们位于对象图的顶部,并且希望保持预期行为的一致性,所以我们将[[Prototype]]of配置Function为Function.prototype。
Function.__proto__ === Function.prototype
从而确保Function instanceof Function === true.
我们可以证明这Function.prototype是一个特殊的函数对象,因为:
Function.prototype.prototype === undefined
...并且每个用户定义的函数(胖箭头除外)在其原型属性上都有一个对象。
由于以上所有:
Object.__proto__ === Function.__proto__
这可能看起来很奇怪,但如前所述,在对象图的顶部,我们有一组有限的候选对象可以指向。
TC-39 现在需要确定[[Prototype]]of the [[Prototype]]ofObject是什么。根据上述我们知道[[Prototype]]ofObject是Function.prototype。
从某种意义上说,我们现在Function.prototype位于对象图中的上方,因此选择了一个特殊Object实例(“原型对象”)作为该值。
这意味着每个原型链的顶部都可以方便地与Object.prototype.
当然,这也满足了一切“都是对象”的理想要求。
Object.__proto__.__proto__ === Object.prototype
此时我们需要完成对象图,所以我们将[[Prototype]]of设置Object.prototype为null。
Object.__proto__.__proto__.__proto__ === null