以编程方式向 javascript 函数添加代码

IT技术 javascript merge append user-defined-functions prepend
2021-02-07 05:27:03

我试图在不修改原始 JS 代码的情况下自定义现有的 JS 库。这段代码加载了一些我可以访问的外部 JS 文件,我想要做的是更改原始文件中包含的功能之一,而无需将整个内容复制并粘贴到第二个 JS 文件中。
例如,禁区 JS 可能有这样的功能:

var someFunction = function(){
    alert("done");
}

我希望能够以某种方式在该函数中添加或添加一些 JS 代码。原因主要是在原始的 untouchable JS 中,函数非常庞大,如果该 JS 被更新,我用它覆盖的函数将过时。

我不完全确定这是可能的,但我想我会检查一下。

6个回答

如果someFunction全局可用,那么您可以缓存该函数,创建自己的函数,并让您调用它。

所以如果这是原版...

someFunction = function() {
    alert("done");
}

你会这样做...

someFunction = (function() {
    var cached_function = someFunction;

    return function() {
        // your code

        var result = cached_function.apply(this, arguments); // use .apply() to call it

        // more of your code

        return result;
    };
})();

这是小提琴


请注意,我使用.apply来调用缓存函数。这让我可以保留 的预期值this,并将传入的任何参数作为单独的参数传递,而不管有多少。

@minitech:什么...你不熟悉 JavaScript 的funciton关键字?;) 感谢您的编辑
2021-03-16 05:27:03
@gdoron:我刚刚添加了一条评论。除非我现在真的很困惑,否则我不知道有任何浏览器不会接受实际的 Arguments 对象作为.apply(). 但是如果它是一个类似 Array 的对象,例如 jQuery 对象,那么是的,某些浏览器会抛出错误
2021-03-16 05:27:03
这个答案真的应该是最重要的——它保留了所讨论函数的功能......我+1。
2021-03-28 05:27:03
+1 用于使用apply:这是真正解决问题的唯一答案
2021-04-03 05:27:03
这个答案碰巧解决了使用实例化对象来控制通过 YouTube Iframe API 嵌入的单个 YouTube 视频的问题。当我尝试创建一个类来以独特的module化方式处理每个视频的数据时,您不知道我一直在努力解决这样一个事实,即 API 要求它的回调是一个单一的全局函数。你是我今天的英雄。
2021-04-12 05:27:03

首先将实际函数存储在一个变量中..

var oldFunction = someFunction;

然后定义你自己的:

someFunction = function(){
  // do something before
  oldFunction();
  // do something after
};
如果您的函数是一个方法,您将需要使用apply它来调用它。看我的回答。
2021-03-17 05:27:03
它为我工作,但更换需要someFunctionwindow.someFunction在上面的代码。原因是我的函数是在 jquery$(document).ready()处理程序中声明的
2021-03-21 05:27:03

您可以创建一个调用您的代码的函数,然后调用该函数。

var old_someFunction = someFunction;
someFunction = function(){
    alert('Hello');
    old_someFunction();
    alert('Goodbye');
}

我不知道您是否可以更新该函数,但根据它的引用方式,您可以在其位置创建一个新函数:

var the_old_function = someFunction;
someFunction = function () {
    /* ..My new code... */
    the_old_function();
    /* ..More of my new code.. */
}

还。如果要更改本地上下文,则必须重新创建函数。例如:

var t = function() {
    var a = 1;
};

var z = function() {
    console.log(a);
};

现在

z() // => log: undefined

然后

var ts = t.toString(),
    zs = z.toString();

ts = ts.slice(ts.indexOf("{") + 1, ts.lastIndexOf("}"));
zs = zs.slice(zs.indexOf("{") + 1, zs.lastIndexOf("}"));

var z = new Function(ts + "\n" + zs);

z() // => log: 1

但这只是最简单的例子。处理参数、注释和返回值仍然需要很多工作。此外,还有很多坑。
toString | 切片| 索引| lastIndexOf | 新功能