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

Mun*_*lla 107 javascript merge append user-defined-functions prepend

我正在尝试自定义现有的JS库而不修改原始的JS代码.这段代码加载了一些我有权访问的外部JS文件,我想要做的是更改原始文件中包含的一个函数,而不复制并将整个文件粘贴到第二个JS文件中.
例如,关闭限制JS可能有这样的功能:

var someFunction = function(){
    alert("done");
}
Run Code Online (Sandbox Code Playgroud)

我希望能够以某种方式将一些JS代码附加或添加到该函数中.原因主要是在原始的不可触摸的JS中,函数非常庞大,如果JS得到更新,我覆盖它的函数将会过时.

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

小智 211

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

所以,如果这是原来的......

someFunction = function() {
    alert("done");
}
Run Code Online (Sandbox Code Playgroud)

你这样做......

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;
    };
})();
Run Code Online (Sandbox Code Playgroud)

这是小提琴


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

  • 使用`apply`的+1:这是*真正*解决问题的唯一答案. (16认同)
  • 这个答案应该是最重要的 - 它保留了相关功能的功能......来自我的+1. (9认同)
  • @minitech:什么......你不熟悉JavaScript的`funciton`关键字?;)感谢您的编辑 (2认同)
  • 这个答案恰好解决了使用实例化对象控制通过YouTube Iframe API嵌入的各个YouTube视频的问题.当我尝试创建一个以独特的模块化方式处理每个视频数据的类时,你不知道我多久努力解决这个问题,即API要求它的回调是一个单一的全局函数.你是我当天的英雄. (2认同)

ggr*_*ner 31

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

var oldFunction = someFunction;
Run Code Online (Sandbox Code Playgroud)

然后定义你自己的:

someFunction = function(){
  // do something before
  oldFunction();
  // do something after
};
Run Code Online (Sandbox Code Playgroud)

  • 如果你的函数是一个方法,你需要使用`apply`来调用它.看到我的回答. (8认同)

Roc*_*mat 10

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

var old_someFunction = someFunction;
someFunction = function(){
    alert('Hello');
    old_someFunction();
    alert('Goodbye');
}
Run Code Online (Sandbox Code Playgroud)


Ned*_*der 6

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

var the_old_function = someFunction;
someFunction = function () {
    /* ..My new code... */
    the_old_function();
    /* ..More of my new code.. */
}
Run Code Online (Sandbox Code Playgroud)


Iva*_*ack 5

也.如果要更改本地上下文,则必须重新创建功能.例如:

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

var z = function() {
    console.log(a);
};
Run Code Online (Sandbox Code Playgroud)

现在

z() // => log: undefined
Run Code Online (Sandbox Code Playgroud)

然后

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);
Run Code Online (Sandbox Code Playgroud)

z() // => log: 1
Run Code Online (Sandbox Code Playgroud)

但这只是最简单的例子.处理参数,注释和返回值还需要做很多工作.此外,还存在许多陷阱.
toString | 切片 | indexOf | lastIndexOf | 新功能