You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重写对象指定方法并保留原有行为?能否实现统计调用次数的Spy函数?

问题一:保留对象指定方法原有行为并添加新功能

要实现这个需求,核心是先保存原方法的引用,再重写目标方法。在重写的方法里,先调用原方法保留原有逻辑,再插入你需要的新功能代码。

举个例子,给console.log添加自定义前缀,同时保留它原本的打印功能:

// 保存原方法引用
const originalLog = console.log;

// 重写console.log
console.log = function(...args) {
  // 先执行原方法,保留原有行为
  originalLog.apply(this, args);
  // 添加新功能:打印额外信息
  originalLog('--- 这是添加的新功能 ---');
};

// 测试
console.log('Hello World');
// 输出:
// Hello World
// --- 这是添加的新功能 ---

这里用apply保证原方法的this指向正确,同时接收所有传入的参数,确保原有功能不受影响。

问题二:创建跟踪函数调用次数的Spy函数

完全可以实现这个Spy函数。思路是:接收目标对象和方法名,保存原方法,替换成一个包装函数,每次包装函数被调用时计数加一,同时调用原方法。最后返回一个包含count属性的对象,用来查看调用次数。

符合示例要求的代码如下:

function Spy(target, method) {
  // 保存原方法
  const originalMethod = target[method];
  // 初始化计数
  const spyObj = { count: 0 };

  // 替换目标方法为包装函数
  target[method] = function(...args) {
    // 计数加一
    spyObj.count++;
    // 调用原方法,保留原有行为
    return originalMethod.apply(this, args);
  };

  return spyObj;
}

// 测试示例
var spy = Spy(console, 'error');

console.error('calling console.error');
console.error('calling console.error');
console.error('calling console.error');

console.log(spy.count); // 输出 3

这个Spy函数会替换目标对象的指定方法,每次调用该方法时都会更新计数,同时完全保留原方法的所有行为(包括参数传递、返回值和this指向)。

内容的提问来源于stack exchange,提问作者Kripthonite

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 22:35:26