【发布时间】:2012-07-09 22:35:47
【问题描述】:
这是一个假设性的问题,确实没有实际用途,但是……
假设你要这样做:
document.open = null;
如何将 document.open 恢复为其原始功能,这可能吗(没有用户制作的临时存储)? document.open 是否以鲜为人知的名称存储在另一个位置?谢谢! :)
【问题讨论】:
标签: javascript function default global restore
这是一个假设性的问题,确实没有实际用途,但是……
假设你要这样做:
document.open = null;
如何将 document.open 恢复为其原始功能,这可能吗(没有用户制作的临时存储)? document.open 是否以鲜为人知的名称存储在另一个位置?谢谢! :)
【问题讨论】:
标签: javascript function default global restore
覆盖document.open 直接在document 对象上创建一个名为open 的变量/函数。但是,原始函数不是在对象本身上,而是在它的原型上——所以你确实可以恢复它。
open 函数来自HTMLDocument.prototype,因此您可以使用HTMLDocument.prototype.open 访问它。
要直接调用它,使用.call()指定要使用它的对象:
HTMLDocument.prototype.open.call(document, ...);
您也可以通过简单地分配来恢复document.open:
document.open = HTMLDocument.prototype.open;
但是,请记住 HTMLDocument 和 document 是宿主对象,通常最好不要弄乱它们 - 特别是在 IE 中,如果你这样做,事情可能会变得混乱。
【讨论】:
alert 之类的东西做这件事?即用自定义函数覆盖 window.alert 相当简单,但是如果不保留临时参考,回滚是具有挑战性的:jsfiddle.net/ovfiddle/kcLBd
alert 很可能直接在window 对象上定义,因此无法通过其他方式访问。由于alert 未标准化,因此您也不能指望在浏览器 x 中运行的解决方案在浏览器 y 中运行。
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 和其他内置函数的工作方式相同。
【讨论】:
delete alert 和 delete window.alert 都失败了,就像 window.alert = window.prototype.alert 在 jsfiddle.net/ovfiddle/kcLBd 中失败一样。除此之外,很好的答案。
var temp = document.open;
document.open = null;
然后你恢复原来的功能
document.open = temp;
【讨论】: