试图删除HTMLElement的原型失败

Attempt to delete prototype of HTMLElement fails

本文关键字:原型 失败 HTMLElement 删除      更新时间:2023-09-26

我试图删除HTMLElement.prototype.insertBefore();,但当我检查它时,而不是未定义的值,它返回实际函数?为什么?

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

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

不能这样使用DELETE:

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

<

属性属性/strong>

每个属性都可以有0个或多个以下属性:ReadOnly, DontEnum, DontDelete和Internal。你可以把它们看作标志——一个属性可以存在于另一个属性上,也可以不存在。在今天的讨论中,我们只对DontDelete感兴趣。

内置和DontDelete

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

认真的,老兄,看看那篇文章。它有一个可笑的清晰和简洁的解释这一切!


注意:即使他们有dontDelete属性集,你仍然可以覆盖它:

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

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

可能有更大的机会是可写的:

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/

HTMLElement.prototype,像所有的DOM一样,是一个"主机对象",它基本上是由ECMAScript环境提供的,在ECMAScript规范中没有定义。主机对象有一些必须遵循的规则:[[Delete]]完全允许什么都不做,即使Object.getPropertyDescriptor[[Configurable]]: false