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
属性集: