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

如何在类中定义的Proxy拦截器内获取类实例作用域

问题原因

Proxy拦截函数的默认this指向handler配置对象,而非外层类实例,直接在set拦截器内调用this.__actions__自然无法访问实例上挂载的监听回调集合。另外原代码存在两个额外问题:

  • 重复声明__data__类字段,第一次赋值的空对象会被直接覆盖,属于无效代码
  • Proxy的set拦截器未返回布尔值,严格模式下执行赋值会抛出类型错误
修复实现

把Proxy初始化逻辑挪到类构造函数中,通过闭包持有当前类实例的引用,即可绕开this指向问题直接访问实例属性,修复后完整代码如下:

class dataset {
  __actions__ = {};
  constructor() {
    // 闭包缓存当前实例引用,供Proxy拦截器调用
    const currentInstance = this;
    this.__data__ = new Proxy({}, {
      set(target, prop, value) {
        // 存在对应字段监听则触发回调,传入新值和旧值方便业务逻辑使用
        if (currentInstance.__actions__[prop]) {
          currentInstance.__actions__[prop](value, target[prop]);
        }
        target[prop] = value;
        // set拦截必须返回true标记赋值成功
        return true;
      },
      get(target, prop) {
        return target[prop];
      }
    });
  }
  setData(prop, val) {
    this.__data__[prop] = val;
  }
  getData(prop) {
    return this.__data__[prop];
  }
  watch(prop, action = () => {}) {
    this.__actions__[prop] = action;
  }
}

// 测试代码
const x = new dataset();
// 注册name字段监听
x.watch('name', (newVal, oldVal) => {
  console.log(`字段name更新,旧值:${oldVal},新值:${newVal}`);
})
x.setData('name', 'satyam');
const y = x.getData('name');
console.log(y); // 输出 satyam

运行后可以看到赋值时监听回调正常触发,数据读写也符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:51:17