有没有办法用函数包装所有JavaScript方法?

时间:2010-10-12 21:22:07

标签: javascript logging function aop wrapping

我想用一些日志代码包装每个函数调用。会产生输出的东西,如:

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

理想情况下,我想要一个以下形式的API:

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

我已经搜索了相当多的内容,但似乎只有面向方面的解决方案需要你包装你想要记录的特定功能,或者其他什么。我想要一些适用于全局范围内的每个函数的东西(显然除了它本身)。

3 个答案:

答案 0 :(得分:10)

一个简单的方法就是这样

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 :(得分:1)

jquery-aop可以做到这一点吗?

答案 2 :(得分:0)

也许您可以将函数传递给函数以作为参数执行:

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

    func_to_run();

}

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

runner(test)