我想了解为什么以下不工作,因为我会认为它的确如此。我想检查一个对象是否是一个窗口。我在想,检查当前窗口和另一个窗口的构造函数是可行的。为什么比较两个窗口的“.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
,但我想创建一个更强大的函数来检查一个对象是否是一个窗口。
窗口是在页面的每个实例中定义的,因此它们是不同的。这是好的,因为我不希望其他网站注入我的原型window.constructor.prototype.alert = function(){/ *一些邪恶的功能* /}; – 2011-10-07 13:43:16
奇怪的是ie7似乎在两个窗口之间共享相同的原型......正如我所说的听起来不安全的xD,但也许是某种xsite保护 – 2011-10-07 13:46:34
使用主机对象通常是不可靠的......它不仅仅是'constructor'属性。 –