js动态访问私有字段(properties/members)

js dynamically access private fields (properties/members)

我正在尝试新的 class private member feature 但是,我很快 运行 遇到一个问题:如何动态访问它们?

我希望它遵循任何一个

的预先存在的语法
constructor(prop, val) {
  this[`#${prop}`] = val; // undefined
}

constructor(prop, val) {
  this.#[prop] = val; // syntax error
}

然而,以上两种方法都失败了。

我认为您不能动态访问私有字段。 proposal 表示:

There are no private computed property names: #foo is a private identifier, and #[foo] is a syntax error.

来自私有属性提案的常见问题解答:

Dynamic access to private fields is contrary to the notion of 'private'.

https://github.com/tc39/proposal-private-fields/blob/master/FAQ.md#why-doesnt-thisx-access-the-private-field-named-x-given-that-thisx-does

无法动态访问私有字段是设计使然。

如果你真的想这么做。

eval(`this.#${propertyName}`)

但这只是打开了一个非常丑陋的蠕虫罐头。

另一种选择是为要动态访问的密钥设置一个私有对象:

class privateTest {
  #pvt = {}

  constructor(privateKey, privateVal) {
    this.#pvt[privateKey] = privateVal;
  }

  getPrivate(privateKey) {
    return this.#pvt[privateKey];
  }

}

const test = new privateTest('hello', 'world');
console.log(test.getPrivate('hello')) // world