当比较一个类型的原型中的函数跨帧(相同的原点)时,我得到了最奇怪的行为:
>>> window.frames[0].HTMLDocument.prototype.open === HTMLDocument.prototype.open
false
使用不太严格的==
时,它的行为完全相同。
知道为什么会这样吗?
答案 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环境的单独实现。这意味着对于环境对象,构造函数和其他函数,每个页面的每个页面必须具有不同的对象(从而无法进行==
检查)。