Приватные поля и методы

Поле внутри класса можно объявить приватным. Для этого перед его именем следует указать символ #. Приватное поле должно быть объявлено вне конструктора. Попытка создания приватного поля внутри конструктора приведет к исключению. Приватное поле доступно  через указатель this только внутри класса, в котором оно объявлено (листинг 11.10).

Листинг 11.10. Приватные поля

class A {
   #a = 10;             // Приватные поля
   #b = 32;
   #c;                  // undefined
   constructor(_a) {
      this.#a = _a;     // Замена значения приватного поля
      // this.#d = 0;   // Так нельзя!
      // SyntaxError: Private field '#d' must be declared 
      // in an enclosing class
   }
   print() {
      console.log(`#a = ${this.#a}`); // #a = 6
      console.log(`#b = ${this.#b}`); // #b = 32
      console.log(`#c = ${this.#c}`); // #c = undefined
   }
}
let objA = new A(6);
// console.log( objA.#a );  // Так нельзя!
// SyntaxError: Private field '#a' must be declared 
// in an enclosing class
objA.print();
console.log( objA );        // A {}
console.log( 
   Object.getOwnPropertyDescriptors( objA ) ); // {}
На заметку

Приватное поле может хранить ссылку на функцию, следовательно, мы можем сделать приватными и методы. Давайте создадим приватный метод и дополнительно реализуем публичный доступ к приватному полю с помощью setter и getter (листинг 11.11).

Листинг 11.11. Приватные поля и методы

class A {
   #x = 10;                       // Приватное поле
   set x(value) {                 // Setter
      this.#x = value;
   }
   get x() {                      // Getter
      return this.#x;
   }
   #privateFunc = function(msg) { // Приватный метод
      console.log(`${msg}${this.#x}`); 
   };
   print() {
      this.#privateFunc('#x = ');
   }
}
let objA = new A();
console.log(objA.x); // 10 (setter)
objA.x = 2;          // (getter)
objA.print();        // #x = 2
// Так нельзя
// objA.#privateFunc('test ');
// SyntaxError: Private field '#privateFunc' 
// must be declared in an enclosing class
На заметку

Учебник по Node.js и JavaScript
Учебник по JavaScript (Node.js) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов