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

我有一个函数,我想覆盖它,但也要根据上下文的顺序执行原始函数。例如,有时当我生成一个页面时,我会想要像这样覆盖:a()a()

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

有时像这样:

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

我如何从覆盖内部获得它?这有可能吗?original_a()a()

请不要建议以这种方式覆盖的替代方案,我知道很多。我特别问的是这种方式。


答案 1

你可以做这样的事情:

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一样,一定要在最后包括。您希望调用外部函数并将结果(两个内部函数之一)存储在 中,而不是将外部函数本身存储在 中。()aa


答案 2

代理模式可能会对您有所帮助:

(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,参数)可以保证调用方无法注意到原始方法和代理方法之间的差异。