Есть ли способ обернуть все методы JavaScript с помощью функции? - PullRequest
12 голосов
/ 13 октября 2010

Я хочу обернуть каждый вызов функции некоторым кодом регистрации.Что-то, что выдает результат, например:

func1(param1, param2)
func2(param1)
func3()
func4(param1, param2)

В идеале, я бы хотел API в виде:

function globalBefore(func);
function globalAfter(func);

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

Ответы [ 3 ]

10 голосов
/ 13 октября 2010

Простой подход был бы примерно таким:

var functionPool = {} // create a variable to hold the original versions of the functions

for( var func in window ) // scan all items in window scope
{
  if (typeof(window[func]) === 'function') // if item is a function
  {
    functionPool[func] = window[func]; // store the original to our global pool
    (function(){ // create an closure to maintain function name
         var functionName = func;
         window[functionName] = function(){ // overwrite the function with our own version
         var args = [].splice.call(arguments,0); // convert arguments to array
         // do the logging before callling the method
         console.log('logging: ' + functionName + '('+args.join(',')+')');
         // call the original method but in the window scope, and return the results
         return functionPool[functionName].apply(window, args );
         // additional logging could take place here if we stored the return value ..
        }
      })();
  }
}

Чтобы отменить, вам нужно запустить

for (func in functionPool)
  window[func] = functionPool[func];

Примечания
Это обрабатывает только глобальные функции, но вы можете легко расширить его для обработки определенных объектов или методов и т. Д.

1 голос
/ 13 октября 2010

jquery-aop может сработать?

0 голосов
/ 13 октября 2010

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

function runner(func_to_run) {
    alert('about to run ' + func_to_run.name);

    func_to_run();

}

function test() {
    alert ('in test');
}

runner(test)
...