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

JavaScript:如何将类方法绑定到Proxy对象触发代理拦截

解决JavaScript Proxy中类方法this指向原对象的问题

问题核心是类方法调用时this未指向Proxy实例,导致修改属性时绕过了Proxy的set陷阱。虽然你在Reflect.get中传入了Proxy作为receiver,但普通函数的this仍由调用方式决定——如果方法是箭头函数(绑定了原对象的this),或者调用场景特殊,就会出现this指向原对象的情况。

解决方案

在Proxy的get陷阱中,对获取到的函数进行绑定,强制让函数调用时的this指向Proxy实例:

class Data {
    i = 0;
    increment() {
        this.i++;
    }
}

const obj = new Data();
const objProxy = new Proxy(obj, {
    get: function(target, prop) {
        const value = Reflect.get(target, prop, objProxy);
        // 绑定函数的this到Proxy实例
        if (typeof value === 'function') {
            return value.bind(objProxy);
        }
        return value;
    },
    set: function(target, prop, value) {
        console.log("setting", prop, "of", target);
        return Reflect.set(target, prop, value, objProxy);
    }
});

objProxy.increment();
console.log(objProxy.i);

原理说明

  • 当通过objProxy.increment获取方法时,get陷阱会先拿到原方法,再通过bind(objProxy)将方法的this永久绑定到Proxy实例。
  • 调用objProxy.increment()时,方法内的this指向Proxy,修改this.i会触发Proxy的set陷阱,输出预期的日志。

注意事项

如果你的类中使用箭头函数作为实例方法(比如increment = () => { this.i++; }),箭头函数的this是定义时就绑定到原对象的,这种情况下bind无法修改this指向,需要改用普通函数形式的方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 04:57:34