Как перегрузить процесс вызова любой функции - PullRequest
2 голосов
/ 26 декабря 2011

Как я могу перегрузить процесс вызова любой функции?

В моем веб-приложении я хочу сделать что-то перед вызовом функции и что-то после него, как я могу сделать это без прототипирования метода вызова (потому что я попробовал это, и это будет работать, только если я вызову функцию как myFunction.call()) и до сих пор имеют запрошенный эффект.

Я перепробовал все, чтобы заставить его работать, но ничего не работает, и сделать это трудным способом (с помощью метода вызова) невозможно, потому что мне пришлось бы переписать весь мой код.

Может кто-нибудь помочь, пожалуйста?

Ответы [ 2 ]

3 голосов
/ 26 декабря 2011

Вы можете создать функцию вызова, которая принимает имя функции, параметры и контекст в качестве параметров:

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();
}

Или используйте решение AnthonyWJones на Вызов динамической функции с динамическими параметрами в Javascript , который можно назвать таким образом caller(funcName, param1, param2);:

function caller(func){
    pre();

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

    post();
} 
3 голосов
/ 26 декабря 2011

Вы можете изменить каждое определение функции вручную.
Вы можете изменить каждый вызов функции вручную.
Если какой-либо из этих рефакторингов выходит за рамки ваших проблем, то вы в затруднительном положении.

Я не знаю общего способа решения вашей проблемы.

Однако, если ваши функции доступны глобально или имеют пространство имен, вы можете сделать следующее довольно легко (и можете сделать это намного больше).в общем случае путем параметризации функций pre, post и т. д.):

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);
   }

})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...