2011-10-07 61 views
1

我想了解为什么以下不工作,因为我会认为它的确如此。我想检查一个对象是否是一个窗口。我在想,检查当前窗口和另一个窗口的构造函数是可行的。为什么比较两个窗口的“.constructor”属性不可靠?

因此,首先创建另一个窗口:

var popup = window.open('', '', ''); 

然后用检查:

popup.constructor === window.constructor; 

但由于某些原因,结果浏览器之间有所不同:

  • IE7:返回true
    • 但是,这仅仅是因为.constructor === undefined
  • IE8:返回false
  • IE9:抛出一个错误,没有文本(""
  • 铬:返回false
    • 虽然在这两种情况下.constructor === DOMWindow - 但DOMWindow是无法直接访问
  • Opera:Retu RNS false
    • 虽然在这两种情况下.constructor === Object
  • 火狐:返回false
    • 虽然在这两种情况下.constructor === Window

为什么不是这个可靠和正常工作? jQuery只是检查"setInterval" in window,但我想创建一个更强大的函数来检查一个对象是否是一个窗口。

+0

窗口是在页面的每个实例中定义的,因此它们是不同的。这是好的,因为我不希望其他网站注入我的原型window.constructor.prototype.alert = function(){/ *一些邪恶的功能* /}; – 2011-10-07 13:43:16

+0

奇怪的是ie7似乎在两个窗口之间共享相同的原型......正如我所说的听起来不安全的xD,但也许是某种xsite保护 – 2011-10-07 13:46:34

+0

使用主机对象通常是不可靠的......它不仅仅是'constructor'属性。 –

回答

3

每个单独的window是一个单独的解释器全局上下文(是的,我现在忽略IE7)。

if (something instanceof Array) { ... } 

与当“东西”是在一个单独的上下文关系,例如像一个iframe的值出现的问题:当你想想instanceof你的问题确实变得清晰。每个窗口都有自己的“Array”构造函数副本,因此即使对象可能是一个Array实例,它也不是具有相同构造函数的实例。

我怀疑是IE7的行为与我认为是一样的东西window.window不等于window其他一些怪事。比如,其中一个实际上是对内部事物的引用。 (也许这是window不等于window.self,即使它们在其他方面表现完全一致。我并没有花费太多的哲学思考时间来思考IE7。)

+0

大声笑,是的,绝对关闭IE7讨论...我声称窗口instanceof window.Math.random – 2011-10-07 13:51:09

+1

我看着IE浏览器,只是为了记录,在IE7/8,'window.window === window'但'window.self!==窗口'。在IE9中,这似乎是固定的。 – pimvdb

+0

谢谢。最近我一直很忙,并没有像在一周内启动Windows VM那么多:-) – Pointy

相关问题