如何重载任何函数的调用过程

时间:2011-12-26 14:26:28

标签: javascript

如何重载任何函数的调用过程?

在我的网络应用程序中,我希望在调用函数之前执行某些操作,之后我会怎样才能执行此操作而无需对调用方法进行原型设计(因为我尝试了这一点,只有当我将函数调用为{{ 1}})仍然具有请求的效果。

我已经尝试了一切使其工作,但没有任何作用,并且以艰难的方式(通过调用方法)这样做是不可行的,因为我将不得不重写我的所有代码。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

您可以手动更改每个功能定义 您可以手动更改每个功能调用 如果这些重构中的任何一个超出了你的问题范围,那么你就会陷入困境。

我不熟悉解决问题的通用方法。

但是,如果您的函数是全局可访问或命名空间的,那么您可以非常轻松地执行以下操作(并且可以通过参数化prepost函数等使其更加通用。)

NS = {
   foo : function(){ console.log('foo'); },
   bar : function(){ console.log('bar'); }
};

// <-- new code goes here

NS.foo();
NS.bar();

// new code below, that should go after definitions but before the calls

(function(){

   var pre = function(){ console.log('pre'); },
       post = function(){ console.log('post'); };

   for (var fn in NS) {
      NS[fn] = (function(fn){ return function(){ pre(); fn(); post(); }; })(fn);
   }

})();

答案 1 :(得分:3)

您可以创建一个调用函数,接受函数名,参数和上下文作为参数:

function pre() {
    alert("I'm before the call");
}

function post() {
    alert("I'm after the call");
}


function caller(func, parameters, context) {
    pre();

    func.apply(context, func, parameters.split(','));

    post();
}

或者在Calling dynamic function with dynamic parameters in Javascript上使用可以这样调用caller(funcName, param1, param2);的AnthonyWJones解决方案:

function caller(func){
    pre();

    this[func].apply(this, Array.prototype.slice.call(arguments, 1)); 

    post();
}