我试图删除.insertBefore();
的{{1}}但是当我检查它时,它会返回实际的函数而不是未定义的值吗?为什么呢?
HTMLElement.prototype
你能解释为什么这不起作用。我在我自己的构造函数上尝试了这个并且它有效,但对于内置的,它没有。
答案 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中对此进行测试时,不会引发任何错误。
在这里看到,如果你创建自己的自定义属性,你可以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
答案 2 :(得分:0)
HTMLElement.prototype
是一个“主机对象”,它基本上是ECMAScript环境中提供的,未在ECMAScript规范中定义。主持人对象几乎没有必须遵循的规则:即使[[Delete]]
具有Object.getPropertyDescriptor
,[[Configurable]]: false
完全不允许执行任何操作。