javascript - 为什么可以删除窗口的重写属性?

标签 javascript

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/

相关文章:

javascript - jqplot: "this.proxy.getTime is not a function"/date 输入解析器?

javascript - 执行多个数组推送/删除操作时如何临时停止计算计算

javascript - 随着变量的增加,如何逐像素重新创建预制 png

javascript - 如何在 javascript 中编写 onblur 和 onfocus 事件?

php - 上传时如何将视频转换为 mp4、webM、ogv?

javascript - 在 javascript 中突出显示标签并将其写入文本框

javascript - 如何刷新 Fuel UX 数据网格中的数据?

javascript - 根据用户的操作显示表行

javascript - 在 Chrome 扩展后台脚本中使用 Sentry 不起作用

javascript - 国际化 : Access locale resolution logic in JavaScript