是否可以在不修改原始代码的情况下向现有javascript函数添加一些代码?

时间:2013-03-06 15:14:01

标签: javascript append aop user-defined-functions prepend

有一些javascript代码,例如

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

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


更新

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

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

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

4 个答案:

答案 0 :(得分:3)

您无法修改函数,但您可以将它们包装起来并用包装器替换该函数。

这样(见a live demo):

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

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

这不会让你获得任何数据它正被函数操纵或改变函数内部发生的事情(虽然你可以捕获参数并在传递它们之前修改它们,你可以捕获返回值并在返回之前修改它。)

答案 1 :(得分:2)

您可以随时使用其他功能名称并调用您想要“扩展”的功能

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

但是你可以找到另一个技巧here

复制代码:

var origParseFloat = parseFloat;
parseFloat = function(str) {
     alert("And I'm in your floats!");
     return origParseFloat(str);
}

答案 2 :(得分:1)

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

答案 3 :(得分:-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);
}