Object .__ proto__中的内容是什么?

Ala*_*orm 10 javascript prototype google-chrome v8 proto

在Google Chrom的javascript中,对象具有一个__proto__指向其原型(或父级)对象的属性.

var foo = {};
console.log(foo.__proto__ === Object.prototype);    //returns true
Run Code Online (Sandbox Code Playgroud)

然而,这是不正确Object对象.

console.log(Object.__proto__ === Object.prototype);    //returns false
Run Code Online (Sandbox Code Playgroud)

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

> console.log(Object.__proto__.toString());
function () {}
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*Ben 6

形成对象图的顶部以保持与规范中其他地方设定的期望一致.

必然会出现这样的情况,即由于"用完了对象"而无法使用普通对象链接.

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

我们希望Function使用Functionfunction-object 创建s ,所以......

Object.__proto__ === Function.prototype
Run Code Online (Sandbox Code Playgroud)

因为我们是在对象图的顶部,并希望保持预期行为的一致性,我们配置[[Prototype]]FunctionFunction.prototype.

Function.__proto__ === Function.prototype
Run Code Online (Sandbox Code Playgroud)

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

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

Function.prototype.prototype === undefined
Run Code Online (Sandbox Code Playgroud)

...并且每个用户定义的函数(胖箭头除外)在其prototype属性上都有一个对象.

由于以上所有原因:

Object.__proto__ === Function.__proto__
Run Code Online (Sandbox Code Playgroud)

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

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

在某种意义上,我们现在Function.prototype位于对象图中,因此选择一个特殊Object实例("原型对象")作为此值.

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

当然,这也满足了所有"都是对象"的理想要求.

Object.__proto__.__proto__ === Object.prototype 
Run Code Online (Sandbox Code Playgroud)

在这一点上,我们需要完成的对象图,所以我们设置[[Prototype]]Object.prototypenull.

Object.__proto__.__proto__.__proto__ === null
Run Code Online (Sandbox Code Playgroud)


Ala*_*orm 4

根据上面的斜视评论,我已经能够弄清楚这一点。我未声明的、不正确的(10 多年)假设是全局Object辅助对象的原型对象也是 javascript 原型链顶部/末端的顶级“原型的原型”。这不是真的。

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

console.log( Object.__proto__ === Function.__proto__ );    //true
Run Code Online (Sandbox Code Playgroud)

Object.__proto__因此,指向空函数的原因是——该空函数Object对象的原型对象。Object如果您想从(不使用)获得原型的原型.prototype,您需要进一步挖掘。

console.log( Object.__proto__.__proto__ === Object.prototype );         //true
Run Code Online (Sandbox Code Playgroud)

我还整理了一个快速图表,绘制了一些 Javascript 较低级别帮助器/构造函数对象的真实原型。

在此输入图像描述

最后 - 我还发现 Google Chrome 已经实现了该Reflect对象,其中包含一个getPrototypeOf方法,该方法看起来与该方法相同Object.getPrototypeOf