2013-03-18 85 views

回答

4

讓我們來分析一下:

Object.prototype 

這給我們的JavaScript對象這是Object變量的原型。什麼是原型?請允許我從耶胡達·卡茨的優秀blog post(非常值得一讀)報價:

如果試圖查找對象上的鍵,它沒有找到, JavaScript就尋找它的原型。它將遵循 「原型鏈」,直到它看到空值。在這種情況下, 它返回undefined。

接下來,我們有:

Object.prototype.toString 

這將返回上Object的原型toString功能。 JavaScript函數可以使用它們的call函數調用。下面是幾個例子:

Object.prototype.toString.call("foo") # => "[object String]" 
Object.prototype.toString.call(5)  # => "[object Number]" 

所以它基本上只是一個通用的toString函數,返回一個字符串描述不管你給作爲參數call。請注意,在這些示例中,參數本身就是對象,因此它們會將描述自己的字符串作爲對象返回。如果我們通過它window.HTMLElement

Object.prototype.toString.call(window.HTMLElement) # => "[object HTMLElementConstructor]" 

所以現在我們看到它返回一個包含字符串"Constructor",這意味着它可能是一個對象,它構造HTML元素的字符串。最後,我們可以理解的充分體現:

Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') # => 19 

由於"Constructor"是一個字符串,indexOf返回19,這是> 0,所以,基本上,這表達似乎檢查window.HTMLElement是否標識本身使用後綴「構造」 ,我猜可能是某種瀏覽器識別檢查。

(注:在寫這一點,我測試使用Safari的網絡督察控制檯評估這些表情,但你也可以使用Chrome或其他瀏覽器的控制檯進行測試這樣的事情)

+0

感謝您的幫助:) – user2131465 2013-03-18 09:16:49

2
  • Object是類(構造函數)從中(幾乎)所有類型的JavaScript繼承。
  • Object.prototype是可以在幾乎所有對象的原型鏈中找到的對象。
  • Object.prototype.toString是在不覆蓋它的對象上調用的方法。
  • .call,當調用一個函數時,以第一個參數作爲上下文調用該函數。 func.call(a)a.func=func; a.func()類似。不同的是,雖然undefined.toString()TypeError,Object.prototype.toString.call(undefined)工作得很好。
  • HTMLElement是HTML元素繼承的類。但是,這不是規範所要求的,並且在Internet Explorer中不是這樣,HTML元素沒有原型,並且在那裏不存在構造函數。由於window是在瀏覽器環境中的全局對象,window.HTMLElement相同HTMLElement如果不是一個局部變量的陰影,並如果它的存在。如果不存在,則讀取HTMLElement將拋出ReferenceError,而window.HTMLElement返回undefined
  • 所以,Object.prototype.toString.call(window.HTMLElement)是一樣的HTMLElement.toString()除了它在IE中工作,並使用正確的toString。它總是返回String
  • indexOf是一個字符串函數,用於查找其子字符串的第一次出現,如果子字符串不存在則返回-1.indexOf('Constructor') > 0檢查字符串是否包含"Constructor",並且不以"Constructor"開頭。

因此,該方法確定在HTMLElement上調用toString時是否包含"Constructor"The specification mandates that

...
4)設類是的[[類]] O.
5)返回字符串值,該值是串接三個字符串的結果的內部屬性「的值[對象「,類和」]「。

因此,這檢查HTMLElement[[class]]Constructor

最後將檢查結果分配給變量isSafari。這表明在哪個環境中這是真實的。此代碼的作者假設返回值包含Safari中的"Constructor",每個版本的Safari中都只有Safari。

僅供參考,在Chrome中,Object.prototype.toString.call(HTMLElement)返回"[object Function]"

+0

@StuartM固定,謝謝。 – 2013-03-18 07:24:31