当前位置:  开发笔记 > 编程语言 > 正文

在引用原始函数时覆盖JavaScript函数

如何解决《在引用原始函数时覆盖JavaScript函数》经验,为你挑选了4个好方法。

我有一个函数,a()我想要覆盖,但也有原始a()的顺序执行,具体取决于上下文.例如,有时当我生成页面时,我想要覆盖如下:

function a() {
    new_code();
    original_a();
}

有时像这样:

function a() {
    original_a();
    other_new_code();
}

我如何original_a()在超越范围内获得这一点a()?它甚至可能吗?

请不要以这种方式建议替代方法,我知道很多.我特意问这个问题.



1> Matthew Crum..:

你可以这样做:

var a = (function() {
    var original_a = a;

    if (condition) {
        return function() {
            new_code();
            original_a();
        }
    } else {
        return function() {
            original_a();
            other_new_code();
        }
    }
})();

original_a在匿名函数内部声明可以防止它混乱全局命名空间,但它可以在内部函数中使用.

像评论中提到的Nerdmaster一样,请务必()在最后添加.您想调用外部函数并将结果(两个内部函数之一)a存储在其中,而不是存储外部函数本身a.


对于像我这样的任何白痴 - 最后密切注意"()" - 没有它,它返回外部函数,而不是内部函数:)
哇,我试图在没有命名空间的情况下这样做,我得到了堆栈溢出,哈哈.

2> PhilHoy..:

该代理模式可以帮助你:

(function() {
    // log all calls to setArray
    var proxied = jQuery.fn.setArray;
    jQuery.fn.setArray = function() {
        console.log( this, arguments );
        return proxied.apply( this, arguments );
    };
})();

上面将其代码包装在一个隐藏"代理"变量的函数中.它将jQuery的setArray方法保存在一个闭包中并覆盖它.然后,代理会记录对方法的所有调用,并将调用委托给原始调用.使用apply(this,arguments)可以保证调用者无法注意到原始方法和代理方法之间的区别.


确实.'apply'和'arguments'的使用使得这比其他答案更加强大

3> Naresh S..:

谢谢大家代理模式真的有帮助.....实际上我想调用一个全局函数foo ..在某些页面我需要做一些检查.所以我做了以下几点.

//Saving the original func
var org_foo = window.foo;

//Assigning proxy fucnc
window.foo = function(args){
    //Performing checks
    if(checkCondition(args)){
        //Calling original funcs
        org_foo(args);
    }
};

Thnx这对我有帮助



4> 小智..:

您可以使用如下构造覆盖函数:

function override(f, g) {
    return function() {
        return g(f);
    };
}

例如:

 a = override(a, function(original_a) {
      if (condition) { new_code(); original_a(); }
      else { original_a(); other_new_code(); }
 });

编辑:修正了一个错字.

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有