为什么我们在窗口的原型链中有2个类对象和对象?
窗口 - > DOMWindow --->对象--->对象--->空
有人可以就这个设计给我一点意见吗?
Follwing是chrome的输出。
答案 0 :(得分:2)
首先:控制台中显示的DOMWindow
是智能开发工具的结果:在这种情况下显示构造函数名称。明确使用window.__proto__.toString()
时,[object Object]
会显示三次。
要回答有关设计的问题,我引用ES5 specification(重点是我的):
所有对象都有一个名为
[[Prototype]]
的内部属性。价值 此属性的值为null或对象,用于 实现继承。本机对象是否可以拥有 作为其[[Prototype]]
的主机对象取决于实现。的每[[Prototype]]
链必须具有有限长度(即从...开始) 任何对象,以递归方式访问[[Prototype]]
内部属性 必须最终导致null
值。
所以,你最终看到null
并不奇怪。
事先的一些(技术)说明:
Object.getPrototypeOf( obj )
返回对象obj
的{{3}}属性。[[Prototype]]
属性表示其内部类。可以使用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
[[Class]]
。window
,global object中的global
。[[Prototype]]
的{{1}}和[[Class]]
属性与实现有关。在Chrome中,global
的实现与section 15.1中描述的实现类似。DOMWindow
类
这似乎是一个虚拟对象,因此缺乏属性。 Global Scope Polluter
的真实实例
这解释了控制台中记录的Object
等属性。 __defineGetter
的{{1}}属性为[[Prototype]]
,请参阅this IDL。获取Object.prototype
属性的代码:
null
[[Class]]
的什么是DOMWindow.idl
?(AFAIK,它的不是 V8s IDL,因为V8的构造函数没有后缀var w = window;
while (1) {
console.log(Object.prototype.toString.call(w));
if (w == null) break;
w = Object.getPrototypeOf(w);
}
)。