Класс ES6 с частными / защищенными свойствами - PullRequest
0 голосов
/ 19 марта 2020

У меня есть класс ES6, как показано ниже

class CoffeeMachine {
  constructor(power) {
    this._power = power;
  }
  get power() {
    return this._power;
  }
}

// create the coffee machine 
let coffeeMachine = new CoffeeMachine(100);

console.log(coffeeMachine);

У меня есть 2 вопроса;

  1. Для console.log (coffeeMachine) я получаю ниже;
CoffeeMachine {
_power: 100,
__proto__:
power: 100
}

Я вижу, что «power» находится на proto CoffeeMachine и также имеет то же значение, т. Е. 100 Как это происходит, если я не устанавливаю "сила" явно где угодно?

Действительно ли возможно реализовать приватное / защищенное в этом примере? Я знаю, что в последней версии ES есть #privateVar, но хотел знать, можно ли его эмулировать в этом коде?

Ответы [ 2 ]

2 голосов
/ 19 марта 2020

геттеры и сеттеры прозрачные , что означает, что наблюдатель (консоль) не может различить guish между обычным свойством и геттером / сеттером.

Как это происходит, если я не устанавливаю "мощность" явно где-либо?

Я думаю, консоль оценивает все значения объекта один раз, затем она связывает эти значения с соответствующий объект, владеющий этими свойствами. В противном случае ему придется оценивать геттер дважды (один раз для объекта и один раз для прототипа), и это поведение, вероятно, нежелательно.

Вы можете вручную оценить геттер на прототипе:

class See { get me() { return "now"; } }

console.log(See.prototype.me);

Реально ли реализовать приватное / защищенное в этом примере?

Да, используя IIFE вокруг карты, которая конечно, возможно в ES6:

 const Private = (() => {
    const priv = new WeakMap();

    return class {
      get priv() { return priv.get(this); }
      set priv(v) { priv.set(this, v); }
    };
 })();

Но, как уже отмечалось в комментариях, вам, вероятно, это не нужно. А для ES2020 есть частные свойства, как вы сказали.

0 голосов
/ 19 марта 2020

Вам необходимо создать приватную переменную с префиксом #. Пример:

class CoffeeMachine {
  #_power;
  constructor(power) {
    this.#_power = power;
  }
  get power() {
    return this.#_power;
  }
}

// create the coffee machine 
let coffeeMachine = new CoffeeMachine(100);

console.log(coffeeMachine);
console.log(coffeeMachine._power);
console.log(coffeeMachine.power);
...