Статические свойства и методы

Можно создать свойства, поля и методы, связанные с самим классом, а не с его экземпляром. Такие свойства, поля и методы называются статическими. При использовании инструкции class перед именем статического поля или метода указывается ключевое слово static. Обратите внимание: внутри статических методов нет доступа к обычным свойствам и методам. В листинге 11.12 мы передаем объект в качестве параметра статического метода. Указатель this внутри статического метода ссылается на класс, а не на экземпляр. Через него мы можем обратиться к статическим членам класса. Статическое свойство можно добавить вне блока класса, указав перед его именем название класса и оператор точка.

Листинг 11.12. Статические свойства, поля и методы

class Car {
   static msg = 'Модель:';      // Статическое поле
   constructor(m) {
      this.model = m;
      console.log(this);
      // Car { model: 'ВАЗ-2109' }
   }
   static showInfo(obj) {       // Статический метод
      console.log(`${this.msg} ${obj.model}`);
      console.log(this);
      // [class Car] { msg: 'Модель:', test: 'test' }
   }
   info() {
      console.log(`${Car.msg} ${this.model}`);
      console.log(`${this.constructor.msg} ${this.model}`);
   }
}
Car.test = 'test';              // Статическое свойство
let obj = new Car('ВАЗ-2109');
Car.showInfo(obj);     // Модель: ВАЗ-2109
console.log(Car.msg);  // Модель:
console.log(Car.test); // test
obj.info();
// Модель: ВАЗ-2109
// Модель: ВАЗ-2109

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

console.log(`${Car.msg} ${this.model}`);
console.log(`${this.constructor.msg} ${this.model}`);

Статические поля можно сделать приватными (листинг 11.13), добавив перед именем поля символ #. Обращаться к приватным полям допускается только внутри методов класса.

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

class Car {
   static #msg = 'Модель:';      // Приватное статическое поле
   static #test = function() {   // Приватный статический метод
      console.log('test()');
   };
   constructor(m) {
      this.model = m;
   }
   showInfo() {
      console.log(`${Car.#msg} ${this.model}`);
      Car.#test();
   }
}
let obj = new Car('ВАЗ-2109');
obj.showInfo();
// Модель: ВАЗ-2109
// test()
// console.log(Car.#msg);
// SyntaxError: Private field '#msg' must be declared 
// in an enclosing class
// Car.#test();
// SyntaxError: Private field '#test' must be declared 
// in an enclosing class

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

Помощь сайту

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

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