的delete操作者,将删除该对象的属性.如果我设置了一个属性window,我可以删除它:
window.myProp = 10;
delete window.myProp;
Run Code Online (Sandbox Code Playgroud)
正如文章中我经常提到的那样,当涉及到delete运算符状态的行为时,这是因为属性赋值不设置DontDelete属性(与变量声明相反,它确实如此).
该条还规定了以下内容(重点补充):
请注意,在属性创建期间,确定属性(即没有设置).以后的分配不会修改现有属性的属性.了解这种区别非常重要.
请记住,为什么我可以覆盖窗口的现有属性alert,然后将其删除以返回原始值?我错过了一些明显的东西吗 我很少使用delete运营商,所以很可能就是这种情况.
例如:
window.alert = function() {};
alert("Hi!"); //Nothing happens
delete window.alert;
alert("Hello?"); //Alerts 'Hello?'
Run Code Online (Sandbox Code Playgroud)
这是一个小提琴来演示(仅在Chome中测试过,非常确定IE不会以这种方式运行,但现在除了Chrome之外无法访问任何内容).
在Chrome中,该window.alert函数是类的原型的一部分DOMWindow,它不是window自身的属性.
因此,当您覆盖时,window.alert您正在添加新属性window,但原型中的版本仍然存在,但是被隐藏.
当您delete window.alert重新暴露原型中的函数时.
这里有一些控制台输出显示该函数在原型中:
> window.constructor.prototype
DOMWindow
> window.constructor.prototype.alert
function alert() { [native code] }
Run Code Online (Sandbox Code Playgroud)
虽然有不同的类名,但Firefox的行为类似.