我正在阅读有关 JavaScript 删除运算符并对其进行试验的内容。在我尝试从窗口对象中删除方法之前,一切似乎都很好。代码如下所示
var log = function(str){
if(str !== undefined)
{
document.write(str);
}
document.write("</br>");
};
window.myVar = function(){
// do something
};
// this deletes custom method
log(delete window.myVar); // true (expected)
log(typeof window.myVar); // undefined (expected)
log(delete window.alert); // true (OK)
log(typeof window.alert); // function (Unexpected)
window.alert = 10;
log(typeof window.alert); // number (Successfully overwritten)
log(delete window.alert); // true
log(typeof window.alert); // function (Returns back to original object)
似乎它可以让我删除我创建的对象,但不能删除已经定义的对象,但它让我可以覆盖它。谁能解释一下背后的原因是什么?如果删除也没有在这里发生的对象,删除也应该返回“假”。
[更新] 我正在使用 FF 19 并在http://jsbin.com中运行它
[更新]请注意,我了解如何覆盖 window.alert 并运行我的自定义代码。我的问题是 window.alert 有什么特别之处以至于它不能被删除但删除返回 true?我知道它是一个原生对象,但这并不能解释为什么这是不可能的。是浏览器JavaScript引擎在被我的代码删除后重新添加警报方法吗?我是否可以编写类似的函数,使另一个使用我的库的用户无法删除但只能覆盖?如何?