javascript函数修改

javascript函数修改,javascript,Javascript,我正在尝试编写一个logger对象,它将消息记录到屏幕上。这是我的密码。 在每个需要记录内容的函数中,我都在函数的开始和结束处编写loggerstart和loggerEnd函数。但是我想为每个函数运行这些代码和调用。有没有办法修改函数原型,使每个函数调用都能自动运行。 (我没有使用任何javascript框架。)您可以使用包装器函数调用每个函数 function wrapper(callback) { loggerstart(); callback(); loggeren

我正在尝试编写一个logger对象,它将消息记录到屏幕上。这是我的密码。 在每个需要记录内容的函数中,我都在函数的开始和结束处编写loggerstart和loggerEnd函数。但是我想为每个函数运行这些代码和调用。有没有办法修改函数原型,使每个函数调用都能自动运行。
(我没有使用任何javascript框架。)

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

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

并用
包装器(yourfunction)调用它

编辑:重写函数以使其更模块化

这是一种令人毛骨悚然的方法,但我有时在需要重写某些函数时使用这种方法。它运行良好,允许任何类型的定制,易于理解(仍然令人毛骨悚然)

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

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


因此,一般来说,它允许您使用自定义编写的包装函数自动将每个函数包装到某个对象中。

因此,现在他需要在整个项目中使用1000万个不同的包装函数来扩充他的每个函数?是的,他这样做了。否则就没有解决办法了。如果你有一个,发布它,但不要只批评我的方法。无论如何…你可以轻松地搜索和替换那1000万个不同的函数(我不认为他有那么多的函数)。我需要这个记录器在我的代码中有尽可能小的占用空间,这样它就可以以最小的工作量集成到我的项目中。你的建议肯定会奏效,但它的影响将是巨大的。在这里投票是为了表达我对你的解决方案的态度。我假设@yilmazhusein曾经在这里问过这样的问题,他已经排除了你的建议,认为这不太可行。我会保证在找到解决方案后立即在这里发布我的解决方案。让我烦恼的不是投票。这是你的无益评论。你可以从堆栈中获取调用方方法名(如果性能不是太大问题的话)…我在我的对象中放置了一个enableLog开关,因此它将仅在需要时运行。这就是性能不会成为问题的原因。如果我能将我的日志代码添加到Function.prototype(这将是一个完美的解决方案),这将非常有用。由于我必须遍历对象中的每个方法并对它们进行修改,因此我已经知道了我的函数名。也许我可以通过窗口对象附加我的全局方法。但关闭另一个函数的函数将被保留(可以手动添加到记录器)。看来这是最好的办法了。谢谢你的回答。通过窗口对象循环将失败。问题是有些窗口属性是可循环的,但不可读。例如,尝试这样做:
alert(typeof(window[“sessionStorage”])。不过,也许您可以通过一些讨厌的异常处理来跳过那些不可读的属性。顺便说一句,您还可以向包装器函数参数添加其他参数(例如称为函数名)。这并不难,但会为您的记录器提供一些有关调用什么函数以及使用什么参数的信息。更改代码以反映“其他参数”的更改。
function wrapper(callback) {
    loggerstart();
    callback();
    loggerend();
}