javascript函数修改

时间:2010-08-04 11:12:35

标签: javascript

我正在尝试编写一个将消息记录到屏幕的记录器对象。这是我的代码。 http://github.com/huseyinyilmaz/javascript-logger 在每个需要记录内容的函数中,我在函数的开头和结尾写了loggerstart和loggerEnd函数。但我想为每个函数运行thos代码自动代码。有没有办法修改函数原型,所以每个函数调用都可以自动运行。 (我没有使用任何javascript框架。)

2 个答案:

答案 0 :(得分:4)

EDIT: Rewritten the function to make it more modular

嗯,这是一种令人毛骨悚然的方式,但是当我需要覆盖某些功能时,我会使用这种方式。它运作良好,允许任何类型的自定义和易于理解(仍然令人毛骨悚然)。

但是,您需要将所有函数存储在某种全局对象中。有关详细信息,请参阅示例。

function dynamic_call_params(func, fp) {
    return func(fp[0],fp[1],fp[2],fp[3],fp[4],fp[5],fp[6],fp[7],fp[8],fp[9],fp[10],fp[11],fp[12],fp[13],fp[14],fp[15],fp[16],fp[17],fp[18],fp[19]);
}

function attachWrapperToFunc(object, funcName, wrapperFunction) {
    object["_original_function_"+funcName] = object[funcName];
    object[funcName] = function() {
        return wrapperFunction(object, object["_original_function_"+funcName], funcName, arguments);
    }
}

function attachWrapperToObject(object, wrapperFunction) {
    for (varname in object) {
        if (typeof(object[varname]) == "function") {
            attachWrapperToFunc(object, varname, wrapperFunction);
        }
    }
}

一些用法示例:

var myProgram = new Object();
myProgram.function_one = function(a,b,c,d) {
    alert(a+b+c+d);
}
myProgram.function_two = function(a,b) {
    alert(a*b);
}

myProgram.function_three = function(a) {
    alert(a);
}

function loggerWrapperFunction(functionObject, origFunction, origFunctionName, origParams) {
    alert("start: "+origFunctionName);
    var result = dynamic_call_params(origFunction, origParams);
    alert("end: "+origFunctionName);
    return result;
}

attachWrapperToObject(myProgram,loggerWrapperFunction);
myProgram.function_one(1,2,3,4);
myProgram.function_two(2,3);
myProgram.function_three(5);

输出将是: start,10,end,start,6,end,start,5,end

因此,通常它允许您使用自定义编写的包装函数自动将每个函数包装在某个对象中。

答案 1 :(得分:0)

您可以使用包装函数调用每个函数。

function wrapper(callback) {
    loggerstart();
    callback();
    loggerend();
}

并使用wrapper(yourfunction);

进行调用