Javascript 假设我删除了window.alert,我将如何恢复它?

Javascript 假设我删除了window.alert,我将如何恢复它?,javascript,Javascript,假设我是用javascript实现的 delete window.alert; // returns true 然后输出console.logwindow.alert;将是未定义的 代码必须有办法访问window.alert中的本机function,对吗? 因此,我将如何取消删除和恢复window.alert 显然,window.alert只是全局对象所有属性的占位符 澄清:我没有丢失window.alert,但我希望它丢失,例如,使它对不太可信的代码不可用,这样就不应该访问window.al

假设我是用javascript实现的

delete window.alert;
// returns true
然后输出console.logwindow.alert;将是未定义的

代码必须有办法访问window.alert中的本机function,对吗? 因此,我将如何取消删除和恢复window.alert

显然,window.alert只是全局对象所有属性的占位符

澄清:我没有丢失window.alert,但我希望它丢失,例如,使它对不太可信的代码不可用,这样就不应该访问window.alert。但是,我假设有办法恢复已删除的功能,我想知道,询问如何撤消对全局对象属性的删除?

窗口对象是普通JavaScript对象。只需保留对警报函数的引用,即可保存警报函数

const alert = window.alert;
delete window.alert; // window.alert is now undefined
window.alert = alert;
如何“取消删除”window.alert

您需要保存函数的引用:

var windowAlertBackup = window.alert;
然后:

window.alert = windowAlertBackup;
到底发生了什么


任何本机窗口函数实际上都是由javascript解释器实现的。在javascript窗口中,alert是指向该本机函数的指针。window.alert是本机window.alert代码的唯一默认引用。

尽管其他答案会让人觉得在javascript中无法取回已删除的window对象,我的问题是window.alert的功能,实际上,有一种方法可以在没有事先备份/复制的情况下恢复全局窗口对象的已删除属性

通过向DOM中注入iframe获得一个处女窗口 当window的window.alert消失时,我们可以通过创建另一个窗口,或者更准确地说,通过我们注入到DOM中的iframe创建contentWindow,从而返回ut

// step 1 "delete window.alert and check its gone, no backupcopy"
console.log(typeof window.alert); // "function"
delete window.alert;
console.log(typeof window.alert); // "undefined"
try{ window.alert(1); } catch(e){console.log(e);} // TypeError: "window.alert is not a function"

// step 2 "insert an iframe into DOM, to take window.alert from its contentWindow"
var iframe = document.createElement("iframe");
document.body.appendChild(iframe);
window.alert = iframe.contentWindow.alert;
console.log(typeof window.alert); // "function"
影响和后果

简单地删除/覆盖这些属性似乎非常有趣,这是一种细粒度禁用对特定Javascript和DOM功能访问的方法。某种形式的阻止脚本通过window.alert=function{}显示警报弹出窗口。 这个吸引人的想法也是我提出这个问题的动机之一。现在,除非我们阻止loopwhole通过iframe.contentWindow重新获得一个原始的、未激活的window副本,否则这似乎不容易实现


“通过iframe取消删除”技巧的基础是,它应用了iframe恢复技巧,以防止通过浏览器加载项天真地删除webrtc功能

难道你不能一开始就不删除它吗?刷新浏览器并注释你的代码,你将获得你的代码。如果需要该功能,请复制window.alert的代码,并在要取消删除时还原。除非保存对该功能的引用,否则无法恢复该功能。@Carcigenicate用例将找到一种方法来删除某些功能,例如window.alert for good,因此,问题是是否可以撤消删除。谢谢您的回答。正如我添加/更新的问题一样,在某种程度上,我的愿望是永远失去警报,因此寻找方法从没有备份副本的情况下恢复。不知道为什么人们对你的问题投了这么多的反对票。我看到了很多临时删除内置窗口函数的用例,我认为这是因为它的措辞有些轻浮/幼稚/挑逗。我最终希望使用比umatrix或noscript更细粒度的方法来限制对Javascript中浏览器对象的访问,方法是在某些方面删除这些对象,以增加/限制/减轻对页面的一些攻击,这些攻击首先需要Javascript工作。在相同的安全性方面,我还看到了其他示例,其中删除某些Javascript功能的好处是nice@humanityANDpeace我认为唯一不保存它的方法是使用window.open或iframe创建一个新窗口