delete
运算符从对象中删除属性。如果我在 window
上设置了一个属性,我可以删除它:
window.myProp = 10;
delete window.myProp;
作为the article当涉及到 delete
运算符状态的行为时,我经常引用其他人,这是因为属性赋值没有设置 DontDelete
属性(与变量声明相反,哪个)。
那篇文章还陈述了以下内容(强调已添加):
Note that it is during property creation that attributes are determined (i.e. none are set). Later assignments don’t modify attributes of existing property. It’s important to understand this distinction.
考虑到这一点,为什么我可以覆盖窗口的现有属性alert
,然后将其删除以返回到原始值?我错过了一些明显的东西吗?我很少使用 delete
运算符,所以很可能就是这种情况。
例如:
window.alert = function() {};
alert("Hi!"); //Nothing happens
delete window.alert;
alert("Hello?"); //Alerts 'Hello?'
这是一个 fiddle证明这一点(仅在 Chome 中测试过,很确定 IE 不会以这种方式运行,但现在除了 Chrome 之外无法访问任何东西)。
最佳答案
在 Chrome 中,window.alert
函数是 DOMWindow
类的原型(prototype)的一部分,它不是 的属性窗口
本身。
因此,当您覆盖 window.alert
时,您正在向 window
添加一个新属性,但原型(prototype)中的版本继续存在, 但被隐藏了。
当您删除 window.alert
时,原型(prototype)中的函数将重新公开。
这是一些控制台输出,显示函数在原型(prototype)中:
> window.constructor.prototype
DOMWindow
> window.constructor.prototype.alert
function alert() { [native code] }
Firefox 的行为类似,尽管类名不同。
关于javascript - 为什么可以删除窗口的重写属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10319602/