Javascript 尝试删除HtmleElement的原型失败

Javascript 尝试删除HtmleElement的原型失败,javascript,Javascript,我试图删除.insertBefore()

我试图删除
.insertBefore()
console.log(HTMLElement.prototype.insertBefore); // function insertBefore() { [native code] }

delete HTMLElement.prototype.insertBefore;

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

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

您不能像这样使用DELETE:

属性属性

每个属性都可以有以下集合中的零个或多个属性-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对象的所有相同规则

例如,在严格模式下尝试
删除
不可配置的属性会引发错误,但在Chrome中测试时,不会引发错误


如图所示,如果您创建了自己的自定义属性,您可以
删除
这很好:

"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

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

您测试过哪些浏览器?你可能会发现你会得到不同的结果。你怎么会想这样做呢?我很好奇,我想写我自己的框架。不过,只是为了好玩。在我读这篇文章之前,我可以说我认为可以使用
delete
关键字像那样删除对象属性吗?是不是
.prototype
和object?@David-你完全正确:你可以像使用
delete
关键字那样删除对象属性。但是,大多数本机函数/方法都具有
dontDelete
属性集: