Private class fields и методы: #name, #method()
Зачем нужны приватные поля и методы? 🔒
Представь, что твой класс — это квартира. Публичные свойства (public) — это гостиная, куда могут заходить все. А приватные (private) — это твоя спальня или сейф. Доступ к ним есть только у тебя (класса), и никто извне не может их изменить или прочитать без разрешения.
class CoffeeMachine {
#waterAmount = 0; // Приватное поле
constructor(power) {
this.power = power; // Публичное поле
}
}
const machine = new CoffeeMachine(100);
console.log(machine.power); // 100 (публичное)
console.log(machine.#waterAmount); // Ошибка! Приватное поле недоступно
Синтаксис приватных полей
Приватные поля объявляются через # перед именем. Это не просто соглашение — движок JavaScript действительно запрещает к ним доступ извне.
class User {
#secretKey = 'qwerty123'; // Приватное поле
constructor(name) {
this.name = name; // Публичное поле
}
getKey() {
return this.#secretKey; // Доступ изнутри класса — разрешён
}
}
const user = new User('Данила');
console.log(user.getKey()); // 'qwerty123'
console.log(user.#secretKey); // SyntaxError
💡 Запомни:
#— часть имени поля. Неprivate, не_, а именно#. Это особенность JavaScript.
Приватные методы 🛡
Методы тоже могут быть приватными! Они полезны для внутренней логики класса, которую не стоит выносить наружу.
class BankAccount {
#balance = 0;
constructor(initialBalance) {
this.#balance = initialBalance;
}
#logTransaction(amount) { // Приватный метод
console.log(`Транзакция: ${amount}. Новый баланс: ${this.#balance}`);
}
deposit(amount) {
this.#balance += amount;
this.#logTransaction(amount); // Вызов приватного метода
}
}
const account = new BankAccount(1000);
account.deposit(500); // Работает
account.#logTransaction(500); // Ошибка! Приватный метод
Особенности приватных полей ⚠️
1. Наследование: Приватные поля не наследуются! Каждый класс должен объявлять свои.
class Parent {
#secret = 'from parent';
}
class Child extends Parent {
getSecret() {
return this.#secret; // Ошибка! Поле недоступно
}
}
2. Доступ только внутри класса: Даже наследники не могут получить доступ к приватным полям родителя.
3. Инкапсуляция: Приватные поля защищают внутреннее состояние объекта от неконтролируемых изменений.
Реальный пример: кэширующий калькулятор
Рассмотрим практический пример — калькулятор с кэшированием результатов. Кэш — идеальный кандидат для приватного поля!
class SmartCalculator {
#cache = new Map(); // Приватное поле для хранения кэша
add(a, b) {
const key = `add_${a}_${b}`;
if (this.#cache.has(key)) {
console.log('Возвращаю результат из кэша!');
return this.#cache.get(key);
}
const result = a + b;
this.#cache.set(key, result);
return result;
}
}
const calc = new SmartCalculator();
console.log(calc.add(2, 3)); // 5 (вычисляет)
console.log(calc.add(2, 3)); // 5 (берёт из кэша)
Когда использовать приватные поля? 🤔
- Внутреннее состояние объекта: Данные, которые не должны изменяться извне.
- Временные переменные: Для промежуточных вычислений внутри методов.
- Кэширование: Хранение результатов тяжёлых вычислений.
- Реализация деталей: Внутренние механизмы, которые могут измениться.
🚀 Совет: Начни использовать приватные поля для всех внутренних переменных класса. Это сделает код чище и безопаснее!
Итог: сила инкапсуляции 💪
Приватные поля и методы — это мощный инструмент для:
- Защиты внутреннего состояния объекта
- Сокрытия сложной реализации
- Предотвращения случайных изменений
- Создания чёткого API класса
class SpaceRocket {
#fuel = 100; // Только внутренний доступ
launch() {
if (this.#checkSystems()) {
this.#startEngines();
}
}
#checkSystems() { ... } // Скрытая логика
#startEngines() { ... }
}
Теперь твои классы стали настоящими крепостями! 🏰 Каждая деталь на своём месте, а важные данные под защитой.