Ala*_*orm 10 javascript prototype google-chrome v8 proto
在Google Chrom的javascript中,对象具有一个__proto__指向其原型(或父级)对象的属性.
var foo = {};
console.log(foo.__proto__ === Object.prototype); //returns true
Run Code Online (Sandbox Code Playgroud)
然而,这是不正确的Object对象.
console.log(Object.__proto__ === Object.prototype); //returns false
Run Code Online (Sandbox Code Playgroud)
该Object.__proto__属性似乎是一个空方法
> console.log(Object.__proto__.toString());
function () {}
Run Code Online (Sandbox Code Playgroud)
除了作为一个关于依赖于从标准体外开始的javascript功能的警告故事 - Object.__proto__功能是什么?
形成对象图的顶部以保持与规范中其他地方设定的期望一致.
必然会出现这样的情况,即由于"用完了对象"而无法使用普通对象链接.
对JavaScript的基本理解使我们期望它[[Prototype]]是Object用于创建Object函数对象的函数的原型属性.
我们希望Function使用Functionfunction-object 创建s ,所以......
Object.__proto__ === Function.prototype
Run Code Online (Sandbox Code Playgroud)
因为我们是在对象图的顶部,并希望保持预期行为的一致性,我们配置[[Prototype]]的Function是Function.prototype.
Function.__proto__ === Function.prototype
Run Code Online (Sandbox Code Playgroud)
从而确保Function instanceof Function === true.
我们可以证明这Function.prototype是一个特殊的函数对象,因为:
Function.prototype.prototype === undefined
Run Code Online (Sandbox Code Playgroud)
...并且每个用户定义的函数(胖箭头除外)在其prototype属性上都有一个对象.
由于以上所有原因:
Object.__proto__ === Function.__proto__
Run Code Online (Sandbox Code Playgroud)
这可能看起来很奇怪,但如前所述,在对象图的顶部,我们有一组有限的候选对象要指向.
TC-39,现在需要确定什么[[Prototype]]的[[Prototype]]的Object了.根据以上我们知道[[Prototype]]的Object是Function.prototype.
在某种意义上,我们现在Function.prototype位于对象图中,因此选择一个特殊Object实例("原型对象")作为此值.
这意味着每个原型链的顶部都可以方便地绑定Object.prototype.
当然,这也满足了所有"都是对象"的理想要求.
Object.__proto__.__proto__ === Object.prototype
Run Code Online (Sandbox Code Playgroud)
在这一点上,我们需要完成的对象图,所以我们设置[[Prototype]]的Object.prototype是null.
Object.__proto__.__proto__.__proto__ === null
Run Code Online (Sandbox Code Playgroud)
根据上面的斜视评论,我已经能够弄清楚这一点。我未声明的、不正确的(10 多年)假设是全局Object辅助对象的原型对象也是 javascript 原型链顶部/末端的顶级“原型的原型”。这不是真的。
辅助Object对象和Function辅助对象都有相同的父原型对象
console.log( Object.__proto__ === Function.__proto__ ); //true
Run Code Online (Sandbox Code Playgroud)
Object.__proto__因此,指向空函数的原因是——该空函数是该Object对象的原型对象。Object如果您想从(不使用)获得原型的原型.prototype,您需要进一步挖掘。
console.log( Object.__proto__.__proto__ === Object.prototype ); //true
Run Code Online (Sandbox Code Playgroud)
我还整理了一个快速图表,绘制了一些 Javascript 较低级别帮助器/构造函数对象的真实原型。
最后 - 我还发现 Google Chrome 已经实现了该Reflect对象,其中包含一个getPrototypeOf方法,该方法看起来与该方法相同Object.getPrototypeOf。
| 归档时间: |
|
| 查看次数: |
8718 次 |
| 最近记录: |