尝试删除HTMLElement的原型失败

时间:2011-09-11 22:42:51

标签: javascript

我试图删除.insertBefore();的{​​{1}}但是当我检查它时,它会返回实际的函数而不是未定义的值吗?为什么呢?

HTMLElement.prototype

你能解释为什么这不起作用。我在我自己的构造函数上尝试了这个并且它有效,但对于内置的,它没有。

3 个答案:

答案 0 :(得分:2)

您不能像这样使用DELETE:

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

  

属性属性

     

每个属性都可以包含以下集合中的零个或多个属性 - ReadOnly,DontEnum,DontDelete和Internal。您可以将它们视为标志 - 属性可以存在于属性上,也可以不存在。出于今天讨论的目的,我们只对DontDelete感兴趣。

     

内置插件和DontDelete

     

所以这就是它的全部内容:属性上的一个特殊属性,用于控制是否可以删除此属性。请注意,内置对象的某些属性被指定为具有DontDelete,因此无法删除。特殊参数变量(或者,正如我们现在所知,Activation对象的属性)具有DontDelete。任何函数实例的length属性也有DontDelete。

认真的人,读那篇文章。它对所有这些都有一个清晰而简洁的解释!


注意:即使他们设置了dontDelete属性,您仍然可以覆盖它:

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

答案 1 :(得分:1)

浏览器实现可能将该属性设置为不可配置。

虽然它可写的可能性更大:

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/

答案 2 :(得分:0)

与所有DOM一样,

HTMLElement.prototype是一个“主机对象”,它基本上是ECMAScript环境中提供的,未在ECMAScript规范中定义。主持人对象几乎没有必须遵循的规则:即使[[Delete]]具有Object.getPropertyDescriptor[[Configurable]]: false完全不允许执行任何操作。