如何重写对象指定方法并保留原有行为?能否实现统计调用次数的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
相关产品推荐
相关产品推荐

