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
函数对象创建 Function
s,所以...
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
方法。
在 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
函数对象创建 Function
s,所以...
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
方法。