为什么比较“构造器”?两个Windows的属性不可靠

Why is comparing the ".constructor" property of two windows unreliable?

本文关键字:构造器 Windows 属性 不可靠 两个 比较 为什么      更新时间:2023-09-26

我正试图理解为什么以下内容不像我认为的那样工作。我想检查一个对象是否是窗口。我想检查当前窗口和另一个窗口的构造函数会起作用。

那么,首先创建另一个窗口:

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

然后检查:

popup.constructor === window.constructor;

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

  • IE7:返回true
      但这仅仅是因为.constructor === undefined
IE8:返回false
  • IE9:抛出没有文本的错误("")
  • Chrome:返回false
    • 虽然在这两种情况下.constructor === DOMWindow -但DOMWindow不能像这样直接访问
  • Opera:返回false
    • 尽管在这两种情况下.constructor === Object
  • Firefox:返回false
    • 尽管在这两种情况下.constructor === Window
  • 为什么这个不可靠,不能正常工作?jQuery只是检查"setInterval" in window,但我想创建一个更健壮的函数来检查一个对象是否是一个窗口。

    每个单独的window都是解释器的单独全局上下文(是的,我暂时忽略了IE7)。当你想到instanceof:

    时,你的问题真的变得清晰起来:
    if (something instanceof Array) { ... }
    

    当"something"是在单独的上下文中构造的值时,就会出现问题,例如iframe。每个窗口都有它自己的"Array"构造函数的副本,所以即使一个对象可能是Array实例,它也不是同一个构造函数的实例。

    我怀疑IE7的行为与其他一些奇怪的东西有关,我认为就像window.window不等于window一样。比如,其中一个实际上是对内部事物的引用。(也许是window不等于window.self,即使它们在其他方面的行为相同。我并没有花太多时间去思考IE7。