Object.__proto__ 里有什么?

What is in Object.__proto__?

在 Google Chrom 的 javascript 中,对象有一个名为 __proto__ 的 属性 指向它们的原型(或父)对象。

var foo = {};
console.log(foo.__proto__ === Object.prototype);    //returns true

但是,对于 Object 对象,这 不正确

console.log(Object.__proto__ === Object.prototype);    //returns false

Object.__proto__ 属性 似乎是一个空方法

> console.log(Object.__proto__.toString());
function () {}

除了作为关于依赖 javascript 从标准主体之外开始的功能的警告故事之外 -- Object.__proto__ 功能是什么?

对象图的顶部是为了与规范中其他地方设定的期望保持尽可能一致。

必然会出现无法使用普通对象链接的情况,因为您 "run out of objects".

对JavaScript的基本理解使我们期望Object[[Prototype]]是用于创建[=17=的函数的原型属性 ] 函数对象。

我们希望使用 Function 函数对象创建 Functions,所以...

Object.__proto__ === Function.prototype

因为我们位于对象图的顶部并且希望保持预期行为的一致性,所以我们将 Function[[Prototype]] 配置为 Function.prototype

Function.__proto__ === Function.prototype

从而保证Function instanceof Function === true.

我们可以证明 Function.prototype 是一个特殊的函数对象,因为:

Function.prototype.prototype === undefined

...并且每个用户定义的函数(fat-arrows 除外)在其原型上都有一个对象 属性。

由于以上原因:

Object.__proto__ === Function.__proto__

这可能看起来很奇怪,但如前所述,在对象图的顶部,我们可以指向一组有限的候选对象。

TC-39 现在需要确定 Object[[Prototype]][[Prototype]] 是什么。 根据以上我们知道 Object[[Prototype]]Function.prototype.

从某种意义上说,我们现在在对象图中位于 Function.prototype 之上,因此选择了一个特殊的 Object 实例("prototype object")作为该值。

这意味着每个原型链的顶部都可以方便地与Object.prototype绑定。

这当然也满足了一切的美好需求"is an object".

Object.__proto__.__proto__ === Object.prototype 

此时我们需要完成对象图,所以我们设置Object.prototype[[Prototype]]null.

Object.__proto__.__proto__.__proto__ === null

根据上面的 squint's 评论,我已经弄清楚了。我未说明的、不正确的(和 10 年以上)假设是全局 Object 辅助对象的原型对象也是 javascript 原型的 top/end 的顶级 "prototype of prototypes"链。这不是真的。

Object 辅助对象和 Function 辅助对象都有相同的父原型对象

console.log( Object.__proto__ === Function.__proto__ );    //true

所以,Object.__proto__ 指向空函数的原因是——空函数 它的 Object 对象的原型对象。如果你想从 Object 得到原型的原型(不使用 .prototype),你需要再往回挖一点。

console.log( Object.__proto__.__proto__ === Object.prototype );         //true

我还整理了一张快速图表,绘制出一些 Javascript 的较低级别 helper/constructor 对象的真实原型。

最后 -- 我还发现 Google Chrome 实现了 Reflect 对象 which includes a getPrototypeOf method,它看起来与 Object.getPrototypeOf方法。