对象类在 DOMWindow 的原型链中出现两次?

Posted

技术标签:

【中文标题】对象类在 DOMWindow 的原型链中出现两次?【英文标题】:Object class comes twice in prototype chain of DOMWindow? 【发布时间】:2012-04-17 01:09:35 【问题描述】:

为什么我们在窗口的原型链中有 2 个类 Object 和一个 Object?

window --> DOMWindow --->Object --->Object ---> null

谁能给我一些关于这个设计的观点?

以下是 chrome 上的输出。

【问题讨论】:

【参考方案1】:

首先:控制台中显示的DOMWindow 是智能开发工具的结果:在这种情况下显示了构造函数名称。当您明确使用window.__proto__.toString() 时,[object Object] 将显示 3 次。

关于设计的注意事项

为了回答您关于设计的问题,我引用了ES5 specification(重点是我的):

所有对象都有一个名为[[Prototype]] 的内部属性。价值 此属性的值为 null 或对象,用于 实现继承。本机对象是否可以具有 主机对象作为其[[Prototype]] 取决于实现。 每个 [[Prototype]] 链必须有有限的长度(即从 任何对象,递归访问[[Prototype]] 内部属性 必须最终导致 null 值)。

所以,最后看到null 并不奇怪。

更多详情

提前一些(技术)说明:

Object.getPrototypeOf( obj ) 返回对象 obj[[Prototype]] 属性。 对象的[[Class]] 属性表示其内部类。可以使用Object.prototype.toString.call( obj ) 提取其名称。

表:

   toString() result:   [[Class]]   #  Additional notes
1. [object DOMWindow]    global     # The global object
2. [object Object]       Object     # [[Prototype]] of the Global object
3. [object Object]       Object     # [[Prototype]] of 2 (dummy?)
4. [object Object]       Object     # [[Prototype]] of 3 === Object.prototype
5. [object Null]         Null       # Object.prototype.__proto__ === null
    global object. 示例:浏览器 javascript 中的 window,Node.js 中的 global。 根据section 15.1,[[Prototype]][[Class]] 的属性global 是依赖于实现的。在 Chrome 中,DOMWindow 的实现类似于this IDL 中描述的实现。 在 Chrome 中,这个构造函数实际上没有名字。在 Firefox 中,这是 Global Scope Polluter 类。这似乎是一个虚拟对象,因此缺少属性。 前一个对象是Object 的真实实例。这解释了控制台中记录的__defineGetter 等属性。 Object.prototype[[Prototype]] 属性是null,请参见section 15.2.4。

其他参考

获取[[Class]] 属性的代码:

var w = window;
while (1) 
    console.log(Object.prototype.toString.call(w));
    if (w == null) break;
    w = Object.getPrototypeOf(w);

15.1 - The Global Object 15.2.4 - Properties of the Object Prototype Object WebCore 的 DOMWindow.idl DOMWindow 的 Interface definition language 是什么?(AFAIK,它 不是 V8s IDL,因为 V8 的构造函数没有后缀 @987654366 @)。

【讨论】:

以上是关于对象类在 DOMWindow 的原型链中出现两次?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript对象属性赋值操作的逻辑

JavaScript 原型对象原型链

关于JS中原型链中的prototype与_proto_的个人理解与详细总结(代码示例+高清无码大图!——自备瓜子花生)

原型陷阱

理解面向对象

JavaScript面向对象(下)