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

P K*_*P K 5 javascript dom prototype google-chrome prototype-chain

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

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

任何人都可以给我一些关于这个设计的观点吗?

Follwing是chrome的输出.

在此输入图像描述

Rob*_*b W 2

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

关于设计的注意事项

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

所有对象都有一个名为 的内部属性[[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
Run Code Online (Sandbox Code Playgroud)
  1. 全局对象
    示例:window在浏览器 JavaScript 中、globalNode.js中。
  2. 根据第 15.1 节[[Prototype]][[Class]]的属性global取决于实现。在 Chrome 中, 的实现DOMWindow类似于此 IDL中描述的实现。
  3. 在 Chrome 中,这个构造函数实际上没有名称。在 Firefox 中,这就是Global Scope Polluter类。
    这似乎是一个虚拟对象,因此缺乏属性。
  4. 前一个对象是 的真实实例Object这解释了控制台中的
    Logged等属性。__defineGetter
  5. [[Prototype]]的性质是Object.prototypenull15.2.4节

其他参考资料