【问题标题】:JS restore default/global functionsJS 恢复默认/全局函数
【发布时间】:2012-07-09 22:35:47
【问题描述】:

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

假设你要这样做:

document.open = null;

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

【问题讨论】:

    标签: javascript function default global restore


    【解决方案1】:

    覆盖document.open 直接在document 对象上创建一个名为open 的变量/函数。但是,原始函数不是在对象本身上,而是在它的原型上——所以你确实可以恢复它。

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

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

    HTMLDocument.prototype.open.call(document, ...);
    

    您也可以通过简单地分配来恢复document.open

    document.open = HTMLDocument.prototype.open;
    

    但是,请记住 HTMLDocumentdocument 是宿主对象,通常最好不要弄乱它们 - 特别是在 IE 中,如果你这样做,事情可能会变得混乱。

    【讨论】:

    • 啊哈!很高兴知道,谢谢! :) 回应您的编辑...令人着迷!我从来不知道这个,再次感谢您提供的信息! :) 我会尽快接受这个
    • 如何为alert 之类的东西做这件事?即用自定义函数覆盖 window.alert 相当简单,但是如果不保留临时参考,回滚是具有挑战性的:jsfiddle.net/ovfiddle/kcLBd
    • alert 很可能直接在window 对象上定义,因此无法通过其他方式访问。由于alert 未标准化,因此您也不能指望在浏览器 x 中运行的解决方案在浏览器 y 中运行。
    • 这在 IE7/IE8 中不起作用,它没有 HTMLDocument 也没有 Window 类型。如何在 IE7/8 中使用原始方法?
    • 最可能的答案是“你不能”。
    【解决方案2】:
    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 alertdelete window.alert 都失败了,就像 window.alert = window.prototype.alertjsfiddle.net/ovfiddle/kcLBd 中失败一样。除此之外,很好的答案。
    • 时代变了,它不再起作用了。既不在 Firefox 也不基于 Chromium。使用完全相同的示例进行测试。
    【解决方案3】:
    var temp = document.open;
    document.open = null;
    

    然后你恢复原来的功能

    document.open = temp;
    

    【讨论】:

    • 有趣——假设你没有温度!还有其他方法吗?
    • 您需要以某种方式创建引用...例如运行一个立即自我执行的匿名函数,将 document.open 作为参数传递
    • 我主要想知道浏览器是否会自行存储第二个引用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    相关资源
    最近更新 更多