2013-02-21 80 views
1

我正在阅读关于JavaScript删除操作符和试验。一切似乎都很好,直到我试图从窗口对象中删除一个方法。代码看起来像下面window.alert无法删除

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是如此特别,以至于它不能被删除,但删除返回true?我知道这是一个本地对象,但这并不能解释为什么这是不可能的。浏览器JavaScript引擎在被我的代码删除后是否重新添加了警报方法?也有可能我写类似的功能,使其他用户使用我的图书馆不能删除,但只能覆盖?怎么样?

+1

原生功能不能被删除。你想做什么? – sdespont 2013-02-21 08:51:22

+0

我明白这不应该在实际的代码中完成,但我在这里试图从技术上确切地知道发生了什么,以及它是否使用了一些JavaScript功能,那些功能是什么,以及如果可以在自定义代码/库中使用这些功能 – Tanmoy 2013-02-21 09:19:10

回答

1

很简单,我们可以覆盖现有的功能但不能删除它们。现有的/标准功能被重置为标准原型,而不是在对其调用时删除。但是,如果你想以中和功能说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 

我希望这可以解释它。

UPDATE:

比方说,你要覆盖一个标准功能 “警报”,则:

//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; 
+0

为什么'log(delete window.alert); //返回true'? – SparKot 2013-02-21 08:52:40

+0

它会返回true,因为像alert这样的函数会将其恢复为默认状态。 – 2013-02-21 09:03:19

+0

“我们可以覆盖现有的功能,但不能抹去它们” - 从技术上来说,这是如何完成的?它是否使用一些公开的JavaScript方式来做到这一点?在这种情况下,我可以在我的自定义代码中使用它吗? – Tanmoy 2013-02-21 09:21:58