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

如何在JavaScript类中重写方括号访问器?

在JavaScript类中重写方括号访问器的实现方式

可以实现自定义的方括号属性访问逻辑,但你给出的示例代码语法不正确,不能直接用[prop]()这种写法来定义访问器。要实现这类需求,主要有两种可行方案:

1. 使用Proxy代理全局拦截属性访问

Proxy可以拦截实例上所有的属性访问操作(包括方括号和点语法),适合需要统一处理所有属性访问的场景:

class Foo {
  constructor() {
    this.bar = {};
    // 返回Proxy包装后的实例,拦截get/set操作
    return new Proxy(this, {
      get(target, prop) {
        // 自定义属性读取逻辑
        return target.bar[prop];
      },
      set(target, prop, value) {
        // 自定义属性赋值逻辑
        target.bar[prop] = value;
        return true; // 必须返回true表示赋值成功
      }
    });
  }
}

// 使用示例
const foo = new Foo();
foo['username'] = 'Alice';
console.log(foo['username']); // 输出 'Alice'
console.log(foo.bar.username); // 同步输出 'Alice'

2. 针对特定属性定义getter/setter

如果只需要对特定已知属性自定义访问逻辑,可以在类中直接定义getter和setter,这种方式无法拦截任意未知属性的访问:

class Foo {
  constructor() {
    this.bar = { title: '默认标题' };
  }

  // 针对title属性的getter
  get title() {
    return this.bar.title;
  }

  // 针对title属性的setter
  set title(newTitle) {
    this.bar.title = newTitle;
  }
}

// 使用示例
const foo = new Foo();
console.log(foo['title']); // 输出 '默认标题'
foo['title'] = '新标题';
console.log(foo['title']); // 输出 '新标题'

关于你示例代码的问题

你写的[prop]()是无效语法,JavaScript中没有这种直接重写方括号访问器的语法,必须借助上述两种方式实现自定义属性访问逻辑。

内容的提问来源于stack exchange,提问作者Adam B.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:35:20