gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 01:33:31 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com