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

时间:2016-12-01 21:41:46

标签: javascript google-chrome prototype v8 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__函数是什么?

2 个答案:

答案 0 :(得分:6)

形成对象图的顶部以保持与规范中其他地方设置的预期一致。

必然会出现这样的情况,即由于“用完了对象”而导致无法使用普通对象链接。

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

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

Object.__proto__ === Function.prototype

由于我们位于对象图的顶部并希望保持预期行为的一致性,因此我们将[[Prototype]]的{​​{1}}配置为Function

Function.prototype

从而确保Function.__proto__ === Function.prototype

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

Function.prototype

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

由于上述所有原因:

Function.prototype.prototype === undefined

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

TC-39现在需要确定Object.__proto__ === Function.__proto__ [[Prototype]]的{​​{1}}是什么。 根据以上所述,我们知道[[Prototype]]的{​​{1}}为Object

在某种意义上,我们现在在对象图中高于[[Prototype]],因此选择了一个特殊的Object实例(“原型对象”)作为此值。

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

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

Function.prototype

此时我们需要完成对象图,因此我们将Object的{​​{1}}设置为Object.prototype

Object.__proto__.__proto__ === Object.prototype 

答案 1 :(得分:3)

根据上面的squint's评论,我已经能够了解到这一点。我没有陈述,不正确(和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的低级助手/构造函数对象的真实原型。

enter image description here

最后 - 我还发现Google Chrome已实施Reflect对象which includes a getPrototypeOf method,该对象似乎与Object.getPrototypeOf方法相同。