对象类在 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 的原型链中出现两次?的主要内容,如果未能解决你的问题,请参考以下文章