2011-10-07 46 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

相關問題