javascript - 在不覆盖当前函数体的情况下扩展 javascript 函数
问题描述
具有以下一项功能
function JsFunction(){
//some logic already done by framework library...
}
现在,我想在该 JsFunction 上添加额外的登录,当我调用它将执行之前完成的逻辑 + 我在其中添加的逻辑。我不想从库中复制相同的逻辑,然后添加我自己的代码。那么,如何使用相同的函数名 JsFunction() 来实现呢?
解决方案
如果函数所做的工作是同步的,那么包装它真的很容易(见下文)。如果它以异步方式工作,您可能会或可能仍然无法包装它,详细信息将根据函数的实现而有所不同。
包装一个同步工作的函数:
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 中的一个特殊伪数组,包含调用传统函数或方法时使用的参数)。this
arguments
使用 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
};
推荐阅读
- powershell - 将 json 作为参数传递给 power shell 脚本
- cmake - CMake RPATH 处理
- azure - azure ml studio 数据文件中的分隔符
- java - 如何修复使用 Firebase 的 Android 应用程序崩溃?
- reactjs - 与打字稿关闭选项卡/窗口反应
- google-apps-script - Apps Script API 未将数据粘贴到 Google 表格中
- java - 没有从 Table 中提取数据并放入 JList - 只是指针
- netlogo - Netlogo 海龟移动和角度
- kubernetes - 在 nodepool 中自动缩放守护进程
- django - 为什么上传图片后文件列表为空