window.alert无法删除

时间:2013-02-21 08:47:51

标签: javascript

我正在阅读有关JavaScript删除操作符并进行实验的文章。在我尝试从window对象中删除一个方法之前,一切似乎都很好。代码如下所示

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)

似乎它允许我删除我创建的对象但不删除已定义的对象,但它让我覆盖它。任何人都可以解释一下它背后的原因是什么?如果无法删除此处也未发生的对象,删除也应返回'false'。

[更新]我正在使用FF 19并在http://jsbin.com

中运行它

[更新] 请注意,我了解如何覆盖window.alert并运行自定义代码。我的问题是window.alert有什么特别之处,它无法删除但delete返回true?我知道它是一个原生对象,但这并不能解释为什么这是不可能的。浏览器JavaScript引擎是否在我的代码删除后重新添加警报方法?我是否可以编写类似的功能,使用我的库的另一个用户不能删除但只覆盖?怎么样?

1 个答案:

答案 0 :(得分:1)

很简单,我们可以覆盖现有的功能,但不能删除它们。当在其上调用delete时,现有/标准函数将重置为标准原型。但如果你想中和函数,请说windows.alert然后分配一个空白函数,如下所示:

window.alert = function(){}; //blank function makes window.alert now useless 

尝试基于控制台(浏览器)的脚本:

window.alert = function(data){
    console.log('alerting:'+data)
}; 
window.alert('hi'); // this will print "alerting:hi" in console
delete window.alert
window.alert('hi'); // now this will show regular alert message box with "hi" in it

我希望这可以解释它。

更新:

假设您要覆盖标准功能“警报”,然后:

//this function will append the data recieved to a HTML element with 
// ID message-div instead of showing browser alert popup
window.alert = function(data){
    document.getElementById('message-div').innerHTML = data;
}
alert('Saved Successfully'); //usage as usual
...
//when you no longer need custom alert then you revert to standard with statement below
delete window.alert;