Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Инкапсуляция в JavaScript/Node.js
Инкапсуляция — это один из основных принципов объектно-ориентированного программирования, который скрывает внутренние детали реализации объекта и предоставляет контролируемый доступ к данным через публичный интерфейс. Рассмотрим несколько практических примеров.
Пример 1: Класс с приватными полями
class BankAccount {
#balance = 0; // Приватное поле (скрыто от внешнего доступа)
constructor(initialBalance) {
if (initialBalance < 0) {
throw new Error('Баланс не может быть отрицательным');
}
this.#balance = initialBalance;
}
// Публичный метод для получения баланса
getBalance() {
return this.#balance;
}
// Публичный метод для пополнения счёта
deposit(amount) {
if (amount <= 0) {
throw new Error('Сумма должна быть положительной');
}
this.#balance += amount;
return this.#balance;
}
// Публичный метод для снятия денег
withdraw(amount) {
if (amount <= 0) {
throw new Error('Сумма должна быть положительной');
}
if (amount > this.#balance) {
throw new Error('Недостаточно средств');
}
this.#balance -= amount;
return this.#balance;
}
}
const account = new BankAccount(1000);
console.log(account.getBalance()); // 1000
account.deposit(500); // 1500
// account.#balance = 999; // ❌ Ошибка: приватное поле недоступно
Пример 2: Замыкания (Closures)
function createCounter() {
let count = 0; // Приватная переменная
return {
increment() {
count++;
return count;
},
decrement() {
count--;
return count;
},
getCount() {
return count;
}
};
}
const counter = createCounter();
console.log(counter.increment()); // 1
console.log(counter.increment()); // 2
console.log(counter.getCount()); // 2
// count доступен только через методы объекта
Пример 3: Getter и Setter
class User {
#password;
constructor(name, password) {
this.name = name;
this.#password = password;
}
// Getter — контролируемый доступ к данным
get password() {
return '*'.repeat(this.#password.length); // Скрываем пароль
}
// Setter — валидация перед установкой значения
set password(newPassword) {
if (newPassword.length < 8) {
throw new Error('Пароль должен быть минимум 8 символов');
}
this.#password = newPassword;
}
// Метод для проверки пароля
verifyPassword(inputPassword) {
return this.#password === inputPassword;
}
}
const user = new User('Alice', 'MySecret123');
console.log(user.password); // '***********'
user.password = 'NewSecret456'; // Валидация сработает
Пример 4: В контексте Node.js сервиса
class OrderService {
#database; // Приватное поле для БД
constructor(dbConnection) {
this.#database = dbConnection;
}
async createOrder(userId, items) {
// Валидация в публичном методе
if (!items || items.length === 0) {
throw new Error('Заказ должен содержать товары');
}
// Приватный метод для расчёта цены
const totalPrice = this.#calculatePrice(items);
// Работа с БД через приватное поле
const order = await this.#database.query(
'INSERT INTO orders (user_id, total_price) VALUES ($1, $2)',
[userId, totalPrice]
);
return order;
}
#calculatePrice(items) {
return items.reduce((sum, item) => sum + item.price * item.quantity, 0);
}
}
Преимущества инкапсуляции
- Безопасность данных — защита от неконтролируемых изменений
- Гибкость — можем менять внутреннюю реализацию без влияния на клиентов
- Валидация — проверка данных при каждом изменении
- Читаемость — ясный публичный интерфейс
- Поддерживаемость — изменения в одном месте
Инкапсуляция — это основа для написания надёжного, масштабируемого кода в Node.js.