2

有一些javascript代码,例如

function hello() {
}
function world() {
}

我想向它们添加一些日志记录代码,但我不想修改代码。我希望我可以在另一个文件中编写一些代码,它会在运行时修改函数。有可能做到这一点吗?


更新

感谢您的两个答案,但我必须让这个问题更清楚。

和函数只是一些示例helloworld实际上文件中有数百个函数,它是手动重新定义它们的实现。

我正在寻找一种自动执行此操作的方法(类似于 java 中的 AspectJ)。

4

4 回答 4

3

您不能修改函数,但可以包装它们并用包装器替换函数。

这样(见现场演示):

function logFactory(func, message) {
    return function () {
        console.log(message);
        return func.apply(this, arguments);
    }
}

hello = logFactory(hello, "Some log message");

这不会让您在函数操作时获取任何数据也不会更改函数内部发生的事情(尽管您可以捕获参数并在传递它们之前修改它们,并且您可以捕获返回值并修改它退还之前)。

于 2013-03-06T15:17:33.800 回答
2

你总是可以使用另一个函数名并调用你想要“扩展”的函数

function extendSomefunction(param) {
    somefunction(param);
    // additional things here
}

但是你可以在这里找到另一个技巧

复制代码:

var origParseFloat = parseFloat;
parseFloat = function(str) {
     alert("And I'm in your floats!");
     return origParseFloat(str);
}
于 2013-03-06T15:17:25.350 回答
1

除了将函数包装在新版本中之外,您唯一的其他选择是在 JavaScript 文件离开您的服务器之前对其进行修改。手动,作为构建步骤,或通过 HttpHandler 动态进行。这是最强大的解决方案,因为它还捕获了在运行时未公开给您包装的私有函数和私有引用。但是,它需要大量的工作,所以如果上面的简单函数包装答案就足够了,我衷心推荐它!

于 2013-03-06T15:51:04.467 回答
-1

您可以包装函数并用包装器替换它:

var originalHello;
originalHello = hello;

hello = function () {
    // log your stuff
    console.log('fired before original hello is triggered');

    // call original hello with the current scope & arguments
    originalHello.apply(this, arguments);
}
于 2013-03-06T15:27:16.770 回答