Javascript JS恢复默认/全局函数

Javascript JS恢复默认/全局函数,javascript,function,default,global,restore,Javascript,Function,Default,Global,Restore,这是一个假设性的问题,它实际上没有实际用途,但是 假设你要做: document.open = null; 如何将一个document.open恢复到其原始功能,这是否可能(没有用户制作的临时存储)?document.open是否以鲜为人知的名称存储在其他位置?谢谢!:) 然后用 document.open = temp; 覆盖document.open直接在document对象上创建名为open的变量/函数。然而,原始函数不是在对象本身上,而是在其原型上,因此您确实可以恢复它 open函数

这是一个假设性的问题,它实际上没有实际用途,但是

假设你要做:

document.open = null;
如何将一个document.open恢复到其原始功能,这是否可能(没有用户制作的临时存储)?document.open是否以鲜为人知的名称存储在其他位置?谢谢!:)

然后用

document.open = temp;

覆盖
document.open
直接在
document
对象上创建名为
open
的变量/函数。然而,原始函数不是在对象本身上,而是在其原型上,因此您确实可以恢复它

open
函数来自
HTMLDocument.prototype
,因此您可以使用
HTMLDocument.prototype.open
访问它

要直接调用它,请使用
.call()
指定要在其上使用它的对象:

HTMLDocument.prototype.open.call(document, ...);
您还可以还原
文档。只需分配它即可打开它:

document.open = HTMLDocument.prototype.open;
但是,请记住,
HTMLDocument
document
都是宿主对象,通常最好不要弄乱它们,尤其是在IE中,如果您这样做,事情可能会失控

delete document.open;
这并不直观,但在自定义函数上使用delete关键字将恢复原始函数,至少只要原型没有被覆盖

例如:

> console.log
function log() { [native code] }

> console.log = function() { }
function () { }

> console.log("Hello world");
undefined

> delete console.log;
true

> console.log("Hello world");
Hello world

与document.open和其他内置函数的工作方式相同。

有趣的是,假设您没有temp!还有其他方法吗?您需要以某种方式创建引用。。。e、 运行一个立即自动执行的匿名函数,将document.open作为Arguments传递给用户。我一直在想,浏览器是否会自己存储第二个引用啊!很高兴知道,谢谢!:)为了回应您的编辑。。。迷人的!我从来不知道这件事,再次感谢你提供的信息!:)我会接受这一点,只要我有能力,一个人会怎么做,像
警报
?i、 e.使用自定义函数覆盖
窗口。警报
非常简单,但是如果不保留临时引用,回滚将非常困难:
警报
很可能直接定义在
窗口
对象上,因此无法通过其他方式访问。由于
警报
未标准化,您也不能期望在浏览器x中工作的解决方案在浏览器y中工作。这在IE7/IE8中不起作用,它没有HTMLDocument或窗口类型。如何使用IE7/8中的原始方法?最可能的答案是“你不能”。
delete alert
delete window.alert
都会失败,就像
window.alert=window.prototype.alert
失败一样。除此之外,答案很好。时代变了,它不再起作用了。无论是在Firefox还是基于Chromium的浏览器中。使用完全相同的示例进行测试。
> console.log
function log() { [native code] }

> console.log = function() { }
function () { }

> console.log("Hello world");
undefined

> delete console.log;
true

> console.log("Hello world");
Hello world