Ответ
Инкапсуляция — это принцип ООП, который объединяет данные и методы, работающие с ними, в единый объект, скрывая внутренние детали реализации. Это позволяет защитить состояние объекта от неконтролируемого доступа и изменений.
Пример в Node.js с использованием приватных полей:
class BankAccount {
#balance = 0; // Приватное поле (синтаксис # доступен в Node.js 12+)
deposit(amount) {
if (amount > 0) {
this.#balance += amount;
} else {
throw new Error('Deposit amount must be positive');
}
}
withdraw(amount) {
if (amount > 0 && amount <= this.#balance) {
this.#balance -= amount;
} else {
throw new Error('Invalid withdrawal amount');
}
}
getBalance() {
return this.#balance;
}
}
// Использование
const account = new BankAccount();
account.deposit(100);
console.log(account.getBalance()); // 100
// account.#balance - SyntaxError: Private field '#balance' must be declared in an enclosing class
Альтернативный подход (до ES2022) с использованием замыканий:
function createBankAccount() {
let balance = 0; // "Приватная" переменная в замыкании
return {
deposit(amount) {
if (amount > 0) balance += amount;
},
getBalance() {
return balance;
}
};
}
const account = createBankAccount();
account.deposit(50);
console.log(account.getBalance()); // 50
// Прямой доступ к balance отсутствует
Почему это важно в Node.js:
- Защита данных: Предотвращает случайное изменение критических данных (баланс, конфигурация)
- Гибкость реализации: Можно менять внутреннюю логику, не ломая внешний API
- Валидация: Контроль над тем, как данные устанавливаются (например, проверка в
deposit()) - Согласованность состояния: Гарантирует, что объект всегда находится в валидном состоянии