JavaScript中如何在类的constructor内代理拦截该类的所有方法?
类方法全局拦截最优实现方案
推荐直接在构造函数中返回当前实例的Proxy代理对象,通过劫持属性访问实现所有方法的统一前置拦截,完全不需要遍历类方法或者修改原有业务逻辑。
完整可运行实现
class Boy { constructor() { // 统一维护前置拦截逻辑,可根据需求自行扩展 const beforeMethodInvoke = (methodName, args) => { if (args.includes(3)) { console.log(`额外输出:调用${methodName}时传入了参数3`) } } // 返回代理后的实例,劫持所有属性访问操作 return new Proxy(this, { get(target, propKey) { const originValue = Reflect.get(target, propKey) // 仅对类方法(函数类型属性)做拦截包装 if (typeof originValue === 'function') { return function (...args) { // 先执行预设前置逻辑 beforeMethodInvoke(propKey, args) // 绑定正确this执行原方法,返回原执行结果 return originValue.apply(target, args) } } // 非方法类属性直接返回原值 return originValue } }) } run(meters) { console.log(meters) } walk(meters) { console.log(`步行了${meters}米`) } } const myBoy = new Boy(); myBoy.run(3) // 输出结果: // 额外输出:调用run时传入了参数3 // 3
方案优势
- 完全无业务侵入,不需要修改原有类方法的内部代码
- 后续给类新增任意方法都会自动触发拦截逻辑,无需额外适配
- 拦截逻辑统一维护,调整规则只需要修改
beforeMethodInvoke函数即可 - 不需要遍历类原型或者实例的属性,性能更优
内容的提问来源于stack exchange,提问作者fahim545
相关产品推荐
相关产品推荐

