JS: 如何在不修改原函数的情况下调用另一个函数?

10

我想在特定页面上扩展第三方库,但我不想更改任何第三方代码。我知道当某些事件发生时第三方库调用的函数名称,因此如果我想要自己的自定义代码在此之后执行,我该怎么做?

第三方库具有:

function eventFinished(args){
    //library stuff here
}

现在如果是我的代码,我会这样做:

function eventFinished(args){
    //library stuff here
    MyCustomFunction();
}
然而,这并不是我想要的,我也不想覆盖原始库代码。那么,有没有办法实现上述功能,但又不用修改原始函数代码呢?我只能引用该函数本身,其他什么也不能做。
编辑:我应该提到声明的函数可以全局使用。

该库调用的函数很可能存在于无法覆盖它的上下文中。例如:如果它在闭包内声明,则无法覆盖它。唯一的方法是,第三方库使用全局范围内定义的函数,这通常不被推荐。 - ichigolas
2个回答

21

如果有一种方法可以让您获取到要扩展的函数的引用,您可以像这样进行“猴子补丁”:

var fnOriginalFunction = functionYouWantToExtend;
functionYouWantToExtend = function() {
    fnOriginalFunction.apply(this, arguments);

    // your code here
};

这实际上以一种较无缝的方式重写了您想要扩展的函数。

关于猴子补丁的更多信息


7

我试图在特定页面上扩展第三方库,但我不想更改任何第三方代码。

这是不可能的。除非代码提供事件发射机制或类似机制,否则必须以某种方式修改代码以对其做出反应。

在不影响库的情况下处理此问题的方法是通过重写要扩展的函数,使其执行其已有的所有操作并在其上添加自定义行为。

例如:

const Library = {
  method() {
    console.log('I am the library method');
  }
}

const unalteredMethod = Library.method;
Library.method = function() {
  unalteredMethod.apply(this, arguments);
  console.log('my custom behavior');
}

Library.method();


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接