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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:36:01