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

Is it possible to add some code to existing javascript functions without modify original code?

本文关键字:代码 javascript 函数 添加 情况下 有可能 修改 原始 是否      更新时间:2023-09-26

有一些javascript代码,例如

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

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


谢谢你的两个答案,但我必须使这个问题更清楚。

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

我正在寻找一种方法来自动做到这一点(类似于java中的AspectJ)。

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

这样的(参见现场演示):

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

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

您可以使用其他函数名并调用您想要"扩展"的函数

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

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

复制的代码:

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

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

您可以将该函数包装起来,并将其替换为包装器:

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);
}