2011-09-11 52 views
2

我試圖刪除的.insertBefore();,但是當我檢查它時,而不是未定義的值,它會返回實際的函數?爲什麼?嘗試刪除HTMLElement的原型失敗

console.log(HTMLElement.prototype.insertBefore); // function insertBefore() { [native code] } 

delete HTMLElement.prototype.insertBefore; 

console.log(HTMLElement.prototype.insertBefore); // function insertBefore() { [native code] } 

你能解釋爲什麼這不起作用。我在我自己的構造函數上嘗試了這一點,並且它的工作原理,但是對於內置構造函數,它沒有。

+0

您測試了哪些瀏覽器?你可能會發現你會得到不同的結果。 –

+0

在Chrome上失敗。 – 0x499602D2

+0

你怎麼會想這樣做?這裏有智力好奇。 – mrtsherman

回答

2

不能使用DELETE這樣的:

http://perfectionkills.com/understanding-delete/

物業屬性

每個屬性都可以有從下面的一組零個或多個屬性 - 只讀,DontEnum,DontDelete和內部。你可以將它們想象成標誌 - 一個屬性可以存在於一個屬性上,也可以不存在。對於今天的討論,我們只對DontDelete感興趣。

內置插件和DontDelete

原來這就是它的所有有關:在控制該屬性是否可以刪除或不是一個性質特殊的屬性。請注意,內置對象的某些屬性被指定爲具有DontDelete,因此不能被刪除。特殊參數變量(或者,正如我們現在所知,Activation對象的屬性)具有DontDelete。任何函數實例的length屬性也有DontDelete。

認真的人,讀那篇文章。它對這一切有一個清晰而簡潔的解釋!


注:,即使他們有dontDelete屬性集,你仍然可以覆蓋它:

HTMLElement.prototype.insertBefore = ''; 
// or 
HTMLElement.prototype.insertBefore = null; 
// or 
HTMLElement.prototype.insertBefore = undefined; 
+0

在我閱讀文章之前,我可以說我認爲你可以像使用'delete'關鍵字那樣刪除對象屬性嗎?而不是'.prototype'和對象? – 0x499602D2

+0

非常非常好的鏈接。 –

+0

@David - 你是絕對正確的:你可以*刪除對象屬性,就像使用'delete'關鍵字一樣。但是,大多數本地函數/方法都有'dontDelete'屬性集:http://perfectionkills.com/understanding-delete/#property_attributes –

1

瀏覽器實現(S)可能有屬性設置爲不可配置。

可能有一個更大的機會,它是可寫的,但:

HTMLElement.prototype.insertBefore = null; 

console.log(HTMLElement.prototype.insertBefore); // null 

請記住,對象,如HTMLElement是主機對象,因此,不一定遵循常規的JavaScript對象的所有相同的規則。

例如,在嚴格模式中嘗試delete不可配置的屬性應該拋出一個錯誤,但在Chrome中測試此錯誤時不會拋出錯誤。

http://jsfiddle.net/YrvE4/2/


這裏看到的,你,如果你創建自己的自定義屬性,你可以delete,只是罰款:

"use strict"; 

HTMLElement.prototype.custom_property = 'value'; // new property 

console.log(HTMLElement.prototype.custom_property); // value 

try { 
    delete HTMLElement.prototype.custom_property; 
} catch (e) { 
    console.log(e); 
} 

console.log(HTMLElement.prototype.custom_property); // undefined 

http://jsfiddle.net/YrvE4/3/

0

HTMLElement.prototype,像所有的DOM,是一個「主機對象」,它基本上是由ECMAScript規範中未定義的ECMAScript環境提供的。主機對象有幾條規則必須遵循:即使Object.getPropertyDescriptor[[Configurable]]: false[[Delete]]也是完全不允許的。