gpt4 book ai didi

javascript - 为什么比较两个窗口的 ".constructor"属性不可靠?

转载 作者:行者123 更新时间:2023-11-30 13:28:23 24 4
gpt4 key购买 nike

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

所以,首先创建另一个窗口:

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",但我想创建一个更强大的函数来检查对象是否是窗口。

最佳答案

每个单独的 window 都是解释器的一个单独的全局上下文(是的,我暂时忽略了 IE7)。当您考虑 instanceof 时,您的问题真的变得很清楚:

if (something instanceof Array) { ... }

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

我怀疑 IE7 的行为与我认为的一些其他怪异行为有关,比如 window.window 不等于 window .就像,其中之一实际上是对内部事物的引用。 (也许是 window 不等于 window.self,即使它们在其他方面的行为相同。我没有在考虑 IE7 上投入大量哲学思考时间。)

关于javascript - 为什么比较两个窗口的 ".constructor"属性不可靠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7688070/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com