来自不同帧的原型链中的等式运算符和属性

时间:2015-03-19 18:30:34

标签: javascript dom

当比较一个类型的原型中的函数跨帧(相同的原点)时,我得到了最奇怪的行为:

>>> window.frames[0].HTMLDocument.prototype.open === HTMLDocument.prototype.open
false

使用不太严格的==时,它的行为完全相同。

知道为什么会这样吗?

2 个答案:

答案 0 :(得分:3)

不同的帧意味着不同的全局对象。您将有两个不同的对象执行相同的操作。同样,window.Object !== frames[0].Object。这也是shouldn't use instanceof Array在处理多种环境时的原因。

请注意,这与您使用的equality operator无关,它们在对象上的工作方式相同,并通过引用进行比较。

答案 1 :(得分:3)

每个浏览上下文都有一个单独的JavaScript环境。

根据W3C's HTML5 spec on Web APIs

  

每当创建一个新的Window对象时,它还必须创建一个脚本设置对象...

     

创建脚本设置对象时,对于用户代理支持的每种语言,创建相关规范定义的适当执行环境。

这要求每个浏览上下文(即,选项卡,框架等中的每个页面)都具有JavaScript环境的单独实现。这意味着对于环境对象,构造函数和其他函数,每个页面的每个页面必须具有不同的对象(从而无法进行==检查)。