2011-09-11 56 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]]也是完全不允许的。