4

我正在尝试新的类私有成员功能 但是,我很快遇到了一个问题:如何动态访问它们?

我希望它遵循任何一个预先存在的语法

constructor(prop, val) {
  this[`#${prop}`] = val; // undefined
}

或者

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

但是,以上两种方法都失败了。

4

4 回答 4

5

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

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
于 2020-04-14T15:44:15.313 回答
4

我认为您不能动态访问私有字段。该提案说:

没有私有计算属性名称:#foo是私有标识符,并且#[foo]是语法错误。

于 2020-04-13T22:10:53.963 回答
2

从关于私有财产提案的常见问题解答中:

对私有字段的动态访问与“私有”的概念相反。

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

缺乏对私有字段的动态访问是设计使然。

于 2020-04-13T22:11:05.137 回答
1

如果你真的想这样做。

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

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

于 2020-04-13T22:20:02.800 回答