js динамический доступ к приватным полям (свойства / члены) - PullRequest
1 голос
/ 14 апреля 2020

Я пробую новую особенность закрытого члена класса ? Однако я быстро столкнулся с проблемой: как получить к ним динамический доступ?

Я ожидал, что она последует ранее существовавший синтаксис

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

или

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

Однако оба вышеперечисленных сбоя.

Ответы [ 4 ]

2 голосов
/ 14 апреля 2020

Другой вариант - иметь закрытый объект для ключей, к которым вы хотите получить динамический доступ:

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
2 голосов
/ 14 апреля 2020

Я не думаю, что вы можете получить доступ к приватным полям динамически. предложение гласит:

Нет закрытых имен вычисляемых свойств: #foo - это закрытый идентификатор, а #[foo] - синтаксическая ошибка.

1 голос
/ 14 апреля 2020

Из часто задаваемых вопросов о предложении для частных объектов:

Dynami c доступ к частным полям противоречит понятию 'private'.

https://github.com/tc39/proposal-private-fields/blob/master/FAQ.md#why -doesnt-thisx-access-the-private-field-named-x-данное-that-this-this-делает

Отсутствие динамического c доступа к закрытым полям по конструкции.

0 голосов
/ 14 апреля 2020

Если бы вы действительно хотели это сделать.

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

Но это просто открывает очень уродливую банку с червями.

...