删除window.alert后如何恢复?全局对象属性删除的复原方法
恢复已删除的
window.alert(及其他全局原生方法) 哈哈这个问题挺有意思!当你执行delete window.alert把这个全局弹窗方法删掉后,确实有几种靠谱的办法能把原生的alert给找回来,下面就给你拆解几个实用方案,这些思路同样适用于其他被误删或故意删除的全局对象属性:
方案一:从干净的iframe上下文获取原生方法
每个iframe都会创建一个独立的浏览器运行上下文,这个上下文里的window对象保留着所有未被修改的原生方法——哪怕当前页面的window.alert被删得一干二净,iframe里的还是完好的。具体操作代码如下:
// 创建一个隐藏的iframe,避免影响页面布局 const iframe = document.createElement('iframe'); iframe.style.display = 'none'; document.body.appendChild(iframe); // 从iframe的window对象中取到原生alert,赋值给当前window window.alert = iframe.contentWindow.alert; // 用完可以把iframe移除,清理一下 document.body.removeChild(iframe);
执行完这段代码后,你再调用alert('测试')就会弹出原生的弹窗了。
方案二:提前备份(最稳妥的预防式方案)
如果你是故意删除alert来防止不可信代码调用,那提前备份原生方法绝对是最省心的恢复方式——毕竟“留一手”总比事后找补简单:
// 先把原生alert存到一个安全的变量里 const originalAlert = window.alert; // 放心删除alert,此时不可信代码就拿不到了 delete window.alert; // 想要恢复的时候,直接把备份赋值回去就行 window.alert = originalAlert;
这个方法的优势是完全不依赖外部上下文,速度最快,而且兼容性拉满。
方案三:从原型链找回(视环境而定)
在部分浏览器环境中,alert其实是Window.prototype上的方法——你执行delete window.alert只是删除了window实例上的属性(如果之前被手动重新定义过的话),原型上的原生方法其实还在。这种情况下直接从原型上取就行:
window.alert = Window.prototype.alert;
不过要注意,这个方法不是100%通用的,有些浏览器会把alert作为window的自身属性存在,这时候原型上就找不到,所以优先用前两种方案更稳妥。
内容的提问来源于stack exchange,提问作者humanityANDpeace
相关产品推荐
相关产品推荐

