首页 > 解决方案 > 先前声明的对象内的 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');
}

标签: javascript

解决方案


用于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


推荐阅读