9.1 Основные концепции
Инкапсуляция — это одна из ключевых концепций объектно-ориентированного программирования (ООП), которая позволяет скрывать внутренние детали реализации объекта и предоставлять доступ к этим деталям через строго определенные интерфейсы. Это помогает улучшить безопасность и упрощает управление кодом.
Преимущества инкапсуляции:
- Сокрытие данных: инкапсуляция позволяет скрывать внутренние детали реализации и предоставлять доступ только к необходимым методам и свойствам. Это предотвращает некорректное использование объектов и улучшает безопасность кода.
- Контроль доступа: инкапсуляция позволяет контролировать доступ к данным и методам, предоставляя возможность изменять внутреннее состояние объекта только через определенные методы.
- Поддерживаемость: инкапсуляция улучшает поддержку кода, так как изменения в реализации не влияют на внешний интерфейс класса. Это позволяет вносить изменения в реализацию без изменения кода, использующего класс.
- Улучшение тестирования: инкапсуляция позволяет изолировать внутреннюю реализацию объекта, что упрощает модульное тестирование и уменьшает вероятность возникновения побочных эффектов.
В JavaScript инкапсуляция реализуется с использованием методов и свойств, а начиная с ES2022, также стали доступны приватные поля и методы.
9.2 Инкапсуляция через замыкания
До введения приватных полей в ES2022, инкапсуляция в JavaScript часто достигалась с использованием замыканий.
Пример:
- Переменная
countдоступна только внутри функцииcreateCounterи недоступна извне - Методы
increment,decrementиgetCountмогут взаимодействовать с приватной переменнойcount
function createCounter() {
let count = 0; // приватная переменная
return {
increment() {
count++;
console.log(count);
},
decrement() {
count--;
console.log(count);
},
getCount() {
return count;
}
};
}
const counter = createCounter();
counter.increment(); // 1
counter.increment(); // 2
console.log(counter.getCount()); // 2
counter.decrement(); // 1
9.3 Приватные поля в ES2022
В ES2022 были введены приватные поля и методы, которые объявляются с использованием символа #. Приватные поля и методы не могут быть доступны или изменены извне класса.
Пример:
- Приватные поля
#nameи#ageобъявлены с использованием символа# - Методы
getName,getAge,setNameиsetAgeпозволяют взаимодействовать с приватными полями - Попытка доступа к приватным полям извне класса приводит к ошибке
class Person {
#name; // приватное поле
#age; // приватное поле
constructor(name, age) {
this.#name = name;
this.#age = age;
}
getName() {
return this.#name;
}
getAge() {
return this.#age;
}
setName(name) {
this.#name = name;
}
setAge(age) {
if (age > 0) {
this.#age = age;
}
}
}
const person = new Person('Alice', 30);
console.log(person.getName()); // "Alice"
console.log(person.getAge()); // 30
person.setName('Bob');
person.setAge(25);
console.log(person.getName()); // "Bob"
console.log(person.getAge()); // 25
console.log(person.#name); // Ошибка: приватное поле недоступно
9.4 Приватные методы
Приватные методы также могут быть объявлены с использованием символа # и быть недоступными извне класса.
Пример:
- Приватное поле
#balanceи приватный метод#logTransactionиспользуются для управления состоянием объектаBankAccount - Приватный метод
#logTransactionвызывается внутри публичных методовdepositиwithdrawдля записи транзакций
class BankAccount {
#balance;
constructor(initialBalance) {
this.#balance = initialBalance;
}
deposit(amount) {
if (amount > 0) {
this.#balance += amount;
this.#logTransaction('deposit', amount);
}
}
withdraw(amount) {
if (amount > 0 && amount <= this.#balance) {
this.#balance -= amount;
this.#logTransaction('withdraw', amount);
}
}
getBalance() {
return this.#balance;
}
#logTransaction(type, amount) {
console.log(`Transaction: ${type} ${amount}`);
}
}
const account = new BankAccount(1000);
account.deposit(500); // "Transaction: deposit 500"
console.log(account.getBalance()); // 1500
account.withdraw(200); // "Transaction: withdraw 200"
console.log(account.getBalance()); // 1300
account.#logTransaction('test', 100); // Ошибка: приватный метод недоступен
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ