可通过Object.defineProperties批量为对象方法添加性能监控与自动重试能力:先用enhanceMethod工厂函数封装代理逻辑,再通过属性描述符替换原方法,保持this绑定、同步/异步兼容及可配置性。

可以借助 Object.defineProperties 在不修改原方法定义的前提下,为对象的多个方法统一添加性能监控与自动重试能力。核心思路是:用代理函数包裹原始方法,在调用前后插入计时、异常捕获、重试控制等逻辑,并通过属性描述符(value)替换原方法。
一、封装可复用的增强函数
先写一个通用工厂函数,接收原始方法、重试配置和监控选项,返回增强后的新方法:
function enhanceMethod(fn, {
retries = 2,
delay = 100,
enableTiming = true,
onBeforeCall,
onAfterCall,
onError
} = {}) {
return async function enhanced(...args) {
let lastError;
const start = enableTiming ? performance.now() : 0;
<pre class="brush:php;toolbar:false;">for (let i = 0; i setTimeout(r, delay * Math.pow(2, i)));
}
}
}
throw lastError;}; }
二、批量注入到目标对象
使用 Object.defineProperties 批量覆盖对象上的指定方法,保持原有属性特性(如不可枚举、不可配置等):
[UPDATE] Starting with
三、注意事项与边界处理
-
保持 this 绑定:增强函数中使用
fn.apply(this, args)确保原方法内部能正确访问对象上下文 -
兼容同步/异步方法:用
Promise.resolve()包裹调用结果,统一处理返回值类型 - 避免无限递归:确保增强后的函数不直接调用自身;若原方法内部又调用了同名方法,需额外设计上下文标记或白名单机制
-
监控数据聚合建议:可在
onAfterCall或onError中上报指标到性能平台(如自定义 metrics 对象或 Sentry)
四、进阶:支持装饰器语法(ES Next)
若环境支持(如 TypeScript 或 Babel),可进一步封装成装饰器,提升可读性:
/posts/${id}










