2014-02-22 92 views
4

我很驚訝地發現,在Firefox控制檯:hasOwnProperty()是否對DOM元素進行了標準化測試?

> document.mozPointerLockElement 
> null 
> 'mozPointerLockElement' in document 
> true 
> document.hasOwnProperty('mozPointerLockElement') 
> false 

而在Chrome控制檯相當於hasOwnProperty()測試返回true:

> document.webkitPointerLockElement 
> null 
> 'webkitPointerLockElement' in document 
> true 
> document.hasOwnProperty('webkitPointerLockElement') 
> true 

不HTML標準指定一個文件的屬性應該是直接的能是否可靠地使用hasOwnProperty()進行測試,或者是所有這些測試都依賴於實施而不是便攜式?

+3

很難確切地知道某件事不存在,但如果這種行爲被標準覆蓋了,我會非常驚訝。 '.hasOwnProperty()'函數是一個JavaScript的東西,而DOM真的與JavaScript無關。他們甚至不使用JavaScript語法來描述API。 – Pointy

+1

在_FireFox_它在'proto(proto(document)); // DocumentPrototype',我相信很少有專門的說明,實際上必須實現諸如'window'和'document'這樣的_Host Objects_,它們應該實現什麼。 –

+1

作爲一般的經驗法則,我只是說_host Objects_,使用'in'來檢查_native objects_(特別是''instanceof's),使用'hasOwnProperty'來檢查。如果你想知道差異, http://stackoverflow.com/a/7614380/1615483 –

回答

3

不HTML標準指定一個文件,屬性應該是直接的,並且可以與hasOwnProperty被可靠地測試()

是,WebIDL並指定。在你的情況下,document.prototype上應該有一個吸氣屬性(如pointerLockElement is a readonly attribute)(因爲它沒有被聲明爲[Unforgeable])。

還是都是這樣的測試依賴實現而不是便攜?

但是,我不知道所有的瀏覽器是否確實遵守這個規範 - 當然有一些規則沒有。另外,您在示例中測試了供應商擴展(前綴爲mozwebkit),我不知道他們的行爲是否完全被指定。如果您想對原型進行測試,請注意there are implementation differences

因此,您最好的選擇是in運算符,它可以檢測所有屬性,而不管它們是定義在對象本身還是其原型之一。您也可以嘗試!== undefined,因爲可爲空的屬性將返回null而不是undefined