有一个功能如下
function JsFunction(){
//some logic already done by framework library...
}
现在,我想在该JsFunction上添加额外的登录信息 当我调用它时,它将在我添加的逻辑+之前执行其逻辑。 我不想从库中复制相同的逻辑,然后添加我自己的代码。 那么,我怎样才能用相同的函数名JsFunction()??
来实现答案 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;
}
)());