在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__
函数是什么?
答案 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的低级助手/构造函数对象的真实原型。
最后 - 我还发现Google Chrome已实施Reflect
对象which includes a getPrototypeOf
method,该对象似乎与Object.getPrototypeOf
方法相同。