10

在 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__功能?

4

2 回答 2

9

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

必然会出现无法使用正常对象链接的情况,因为您“用完了对象”。

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

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

Object.__proto__ === Function.prototype

因为我们位于对象图的顶部,并且希望保持预期行为的一致性,所以我们将[[Prototype]]of配置FunctionFunction.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]]ofObjectFunction.prototype

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

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

当然,这也满足了一切“都是对象”的理想要求。

Object.__proto__.__proto__ === Object.prototype 

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

Object.__proto__.__proto__.__proto__ === null
于 2016-12-01T21:56:36.717 回答
4

根据上面斜视的评论,我已经能够深入了解这一点。我未说明的,不正确的(和 10 年以上)假设是全局Object帮助对象的原型对象也是 javascript 原型链顶部/末端的顶级“原型原型”。这不是真的。

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

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

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

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

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

在此处输入图像描述

最后——我还发现谷歌浏览器已经实现了这个Reflect对象,其中包括一个getPrototypeOf方法,看起来和方法是一样的Object.getPrototypeOf

于 2016-12-02T17:26:12.157 回答