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 (берёт из кэша)

Когда использовать приватные поля? 🤔

  1. Внутреннее состояние объекта: Данные, которые не должны изменяться извне.
  2. Временные переменные: Для промежуточных вычислений внутри методов.
  3. Кэширование: Хранение результатов тяжёлых вычислений.
  4. Реализация деталей: Внутренние механизмы, которые могут измениться.

🚀 Совет: Начни использовать приватные поля для всех внутренних переменных класса. Это сделает код чище и безопаснее!


Итог: сила инкапсуляции 💪

Приватные поля и методы — это мощный инструмент для:

  • Защиты внутреннего состояния объекта
  • Сокрытия сложной реализации
  • Предотвращения случайных изменений
  • Создания чёткого API класса
class SpaceRocket {
  #fuel = 100; // Только внутренний доступ

  launch() {
    if (this.#checkSystems()) {
      this.#startEngines();
    }
  }

  #checkSystems() { ... } // Скрытая логика
  #startEngines() { ... }
}

Теперь твои классы стали настоящими крепостями! 🏰 Каждая деталь на своём месте, а важные данные под защитой.

Скрыть рекламу навсегда

📘 VK Видео — обучение без ограничений

Все уроки доступны без VPN, без блокировок и зависаний.

Можно смотреть с телефона, планшета или компьютера — в любое время.

▶️ Смотреть на VK Видео