Приватные и статические члены
Не все данные объекта стоит открывать внешнему коду. Если любой может записать в баланс счёта отрицательное число, объекту трудно оставаться правильным. Приватные поля прячут данные внутри класса, а статические члены принадлежат самому классу, а не его объектам.
Приватное поле
Поле, имя которого начинается с #, доступно только внутри класса. Снаружи его нельзя ни прочитать, ни изменить:
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 ему не нужен — его можно сделать статическим.