var isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0;
誰能告訴我上面的代碼是幹什麼的?這條語句「Object.prototype」做什麼?
var isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0;
誰能告訴我上面的代碼是幹什麼的?這條語句「Object.prototype」做什麼?
讓我們來分析一下:
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或其他瀏覽器的控制檯進行測試這樣的事情)
感謝您的幫助:) – user2131465 2013-03-18 09:16:49
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]"
。
@StuartM固定,謝謝。 – 2013-03-18 07:24:31
只是好奇,你在哪裏找到這個? – 2013-03-18 07:07:02