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

时间:2012-04-03 11:24:58

标签: javascript dom google-chrome prototype prototype-chain

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

窗口 - > DOMWindow --->对象--->对象--->空

有人可以就这个设计给我一点意见吗?

Follwing是chrome的输出。

enter image description here

1 个答案:

答案 0 :(得分:2)

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

关于设计的注意事项

要回答有关设计的问题,我引用ES5 specification(重点是我的):

  

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

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

更多详情

事先的一些(技术)说明:

表:

   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
  1. [[Class]]
    示例:浏览器JavaScript中的windowglobal object中的global
  2. 根据Node.js[[Prototype]]的{​​{1}}和[[Class]]属性与实现有关。在Chrome中,global的实现与section 15.1中描述的实现类似。
  3. 在Chrome中,此构造函数实际上没有名称。在Firefox中,这是DOMWindow这似乎是一个虚拟对象,因此缺乏属性。
  4. 上一个对象是Global Scope Polluter的真实实例 这解释了控制台中记录的Object等属性。
  5. __defineGetter的{​​{1}}属性为[[Prototype]],请参阅this IDL
  6. 其他参考资料