扩展javascript函数而不覆盖当前函数体

时间:2018-04-27 09:33:10

标签: javascript inheritance

有一个功能如下

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

现在,我想在该JsFunction上添加额外的登录信息 当我调用它时,它将在我添加的逻辑+之前执行其逻辑。 我不想从库中复制相同的逻辑,然后添加我自己的代码。 那么,我怎样才能用相同的函数名JsFunction()??

来实现

2 个答案:

答案 0 :(得分:3)

如果该函数所做的工作是同步的,它很容易包装它(见下文)。如果它的工作是异步,你可能还是可能无法包装它,细节将根据函数的实现而有所不同。

包装同步工作的功能:

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调用原始函数,调用替换函数的this和调用它的所有参数(arguments是一个特殊的伪 - JavaScript中的数组,包含调用传统函数或方法时使用的参数。)

借助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
};

答案 1 :(得分:2)

复制旧函数,然后创建一个调用它的新函数(传入任何参数和正确的上下文),捕获返回值,执行其他操作,然后返回返回值。

(function () { // In an IIFE to avoid creating a global variable
    let oldJsFunction = JsFunction;
    JsFunction = function JsFunction() {
        let return_value = oldJsFunction.apply(this, arguments);
        console.log("… and another thing");
        return return_value;
    }
)());