Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Приватные и статические члены

Не все данные объекта стоит открывать внешнему коду. Если любой может записать в баланс счёта отрицательное число, объекту трудно оставаться правильным. Приватные поля прячут данные внутри класса, а статические члены принадлежат самому классу, а не его объектам.

Приватное поле

Поле, имя которого начинается с #, доступно только внутри класса. Снаружи его нельзя ни прочитать, ни изменить:

class Account {
  #balance = 0;
 
  getBalance() {
    return this.#balance;
  }
}
 
const account = new Account();
 
console.log(account.getBalance()); // 0

Попытка написать account.#balance вне класса — синтаксическая ошибка: программа даже не запустится.

Инкапсуляция

Раз приватное поле нельзя изменить напрямую, его меняют через методы, а методы проверяют данные. Скрытие данных за методами называется инкапсуляцией:

class Account {
  #balance = 0;
 
  deposit(amount) {
    if (amount > 0) {
      this.#balance += amount;
    }
  }
 
  getBalance() {
    return this.#balance;
  }
}
 
const account = new Account();
account.deposit(100);
account.deposit(-50);
 
console.log(account.getBalance()); // 100

Отрицательное пополнение отклонено: объект сам следит, чтобы его данные оставались верными.

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

Решётку можно поставить и перед именем метода. Такой метод — внутренняя деталь класса, вызвать его можно только из других методов:

class Order {
  constructor(price) {
    this.price = price;
  }
 
  #tax() {
    return this.price * 0.2;
  }
 
  total() {
    return this.price + this.#tax();
  }
}
 
console.log(new Order(100).total()); // 120

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

Метод со словом static принадлежит классу, а не объектам. Его вызывают через имя класса — обычно так пишут вспомогательные функции и способы создать объект:

class Temperature {
  static toFahrenheit(celsius) {
    return celsius * 1.8 + 32;
  }
}
 
console.log(Temperature.toFahrenheit(20)); // 68

Для вызова статического метода объект создавать не нужно.

Статические свойства

Статическое свойство хранит значение, общее для всего класса. Например, счётчик созданных объектов:

class User {
  static count = 0;
 
  constructor(name) {
    this.name = name;
    User.count++;
  }
}
 
new User('Анна');
new User('Олег');
 
console.log(User.count); // 2

Частая ошибка

Статический метод нельзя вызвать у объекта — у экземпляра его просто нет:

class Temperature {
  static toFahrenheit(celsius) {
    return celsius * 1.8 + 32;
  }
}
 
const t = new Temperature();
 
console.log(typeof t.toFahrenheit);           // undefined
console.log(typeof Temperature.toFahrenheit); // function

Если метод работает с данными конкретного объекта через this, он не должен быть статическим. Если this ему не нужен — его можно сделать статическим.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.