我想了解爲什麼以下不工作,因爲我會認爲它的確如此。我想檢查一個對象是否是一個窗口。我在想,檢查當前窗口和另一個窗口的構造函數是可行的。爲什麼比較兩個窗口的「.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'屬性。 –