为什么要删除窗口的重写属性?

Jam*_*ice 15 javascript

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之外无法访问任何内容).

Aln*_*tak 9

在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的行为类似.