javascript - 先前声明的对象内的 Javascript 函数():“被调用”事件?
问题描述
如何检测调用 getX 以触发另一个函数?
限制:只能在声明后module
修改,因为此对象是从远程网站加载的脚本中接收的。目标是老虎
A.此脚本是从另一个网站加载的 ( <script src="//remote.com/script.js">
)
var module = {
x: 42,
getX: function() {
return this.x;
}
}
B.这个脚本在我的网站上<script>...</script>
when_getX_isExecuted function() {
console.log('getX was executed');
}
解决方案
用于Object.defineProperty
覆盖旧函数并在新函数中触发您想要触发的任何内容,然后调用旧函数。
var module = {
x: 42,
getX: function() {
return this.x;
}
};
function listenToFunction(object, propertyName, callBack) {
var oldProperty = object[propertyName];
if (typeof oldProperty !== "function") throw Error(`object.${propertyName} is not a function`);
Object.defineProperty(object, propertyName, {
value: function() {
var params = [].slice.call(arguments);
var result = oldProperty.apply(object, params);
callBack(object, propertyName, params, result);
return result;
}
});
}
console.log(module.getX()); // will not trigger
listenToFunction(module, "getX", function(object, propertyName, params, result) {
console.log(`The function '${propertyName}' was called on the object ${JSON.stringify(object)}, with arguments ${JSON.stringify(params)}. The result was ${JSON.stringify(result)}`);
});
console.log(module.getX()); // will trigger
console.log(module.getX(1, 2, 3)); // will trigger
推荐阅读
- python - 我需要帮助了解线程利用率
- api-gateway - 通过 Datapower 网关脚本获取无效 XML 的响应负载
- c# - 如何将对象传递给包含 .NetCore 中的 html 字符串的控制器
- reactjs - 尽管有文件加载器(url-loader),但图像没有在使用 Webpack 的 React 应用程序中加载
- cuda - 为什么在这里使用 ceil 以及它的用途是什么
- selenium - 是否可以使用 Selenium 保存浏览器控制台的命令输出?
- python - 如何从包含所有链接列表的文本文件中下载 1 次运行?
- dockerfile - 在我的 Docker 文件中包含其他 Docker 文件
- docker - 高山 linux 上的 Bash
- pandas - Matplotlib Subplot Boxplot x 刻度标签不显示