在 Google Chrom 的 javascript 中,对象有一个名为 __proto__
的属性,它指向它们的原型(prototype)(或父)对象。
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__
函数是什么?
最佳答案
对象图的顶部是为了与规范中其他地方设定的期望保持尽可能一致的。
必然会出现无法使用普通对象链接的情况,因为您“用完了对象”。
对 JavaScript 的基本理解使我们期望 Object
的 [[Prototype]]
是用于创建 Object 的函数的原型(prototype)属性
函数对象。
我们希望使用 Function
函数对象创建 Function
,所以...
Object.__proto__ === Function.prototype
因为我们位于对象图的顶部并且希望保持预期行为的一致性,所以我们将 [[Prototype]]
的 Function
配置为 函数.原型(prototype)
.
Function.__proto__ === Function.prototype
从而确保 Function instanceof Function === true
。
我们可以证明 Function.prototype
是一个特殊的函数对象,因为:
Function.prototype.prototype === undefined
...每个用户定义的函数(fat-arrows 除外)在其原型(prototype)属性上都有一个对象。
由于以上原因:
Object.__proto__ === Function.__proto__
这可能看起来很奇怪,但如前所述,在对象图的顶部,我们可以指向一组有限的候选对象。
TC-39 现在需要识别 Object
的 [[Prototype]]
的 [[Prototype]]
是什么。
根据上面我们知道 Object
的 [[Prototype]]
是 Function.prototype
。
从某种意义上说,我们现在在对象图中位于 Function.prototype
之上,因此选择了一个特殊的 Object
实例(“原型(prototype)对象”)作为该值.
这意味着每个原型(prototype)链的顶部都可以方便地与 Object.prototype
绑定(bind)。
这当然也满足了一切“都是对象”的可取要求。
Object.__proto__.__proto__ === Object.prototype
此时我们需要完成对象图,所以我们将Object.prototype
的[[Prototype]]
设置为null
.
Object.__proto__.__proto__.__proto__ === null
关于javascript - Object.__proto__ 中有什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40920909/