首页 > 解决方案 > 在不覆盖当前函数体的情况下扩展 javascript 函数

问题描述

具有以下一项功能

function JsFunction(){
//some logic already done by framework library...
}

现在,我想在该 JsFunction 上添加额外的登录,当我调用它将执行之前完成的逻辑 + 我在其中添加的逻辑。我不想从库中复制相同的逻辑,然后添加我自己的代码。那么,如何使用相同的函数名 JsFunction() 来实现呢?

标签: javascriptinheritance

解决方案


如果函数所做的工作是同步的,那么包装它真的很容易(见下文)。如果它以异步方式工作,您可能会或可能仍然无法包装它,详细信息将根据函数的实现而有所不同。

包装一个同步工作的函数:

var original = JsFunction;
JsFunction = function JsFunction() {
    // Do stuff before
    // ...
    // Call it
    var result = original.apply(this, arguments);
    // Do stuff after
    // ...
    return result; // Or something else if you prefer
};

那个肉是

var result = original.apply(this, arguments);

...它用于调用与调用替换Function#apply函数相同的原始函数以及调用它的所有参数(是 JavaScript 中的一个特殊伪数组,包含调用传统函数或方法时使用的参数)。thisarguments

使用 ES2015+ 的特性,你可以arguments用一个 rest 参数替换使用:

var original = JsFunction;
JsFunction = function JsFunction(...args) {
    // Do stuff before
    // ...
    // Call it
    var result = original.apply(this, args);
    // Do stuff after
    // ...
    return result; // Or something else if you prefer
};

推荐阅读