Приватні властивості
1. Що таке приватна властивість
Приватна властивість, це властивість класу, що починається із символу #.
Вона доступна лише всередині самого класу,
а ззовні повністю недоступна (і навіть не видна).
class User {
#password = "12345"; // приватна властивість
checkPassword(pwd) {
return pwd === this.#password;
}
}
const u = new User();
console.log(u.#password); // SyntaxError: не можна звернутися напряму
console.log(u.password); // undefined
console.log(u.checkPassword("12345")); // trueТут:
#password, це приватна властивість- вона доступна лише всередині методів класу
- ззовні спроба звернення викликає синтаксичну помилку, а не просто
undefined.
2. Приватні методи
Можна приховувати не лише властивості, а й методи:
class Account {
#balance = 0;
#log(message) {
console.log("[LOG]:", message);
}
deposit(amount) {
this.#balance += amount;
this.#log(`Balance topped up by ${amount}`);
}
getBalance() {
return this.#balance;
}
}
const acc = new Account();
acc.deposit(100);
// acc.#log("test"); // Помилка: приватний метод
console.log(acc.getBalance()); // 100Приватні методи часто використовують для "допоміжної логіки", яку не потрібно показувати користувачеві.
3. Відмінність від звичайних властивостей
| Властивість | Видимість | Чи можна змінити ззовні? | Чи можна перелічити (for...in)? |
|---|---|---|---|
this.value | Публічна | Так | Так |
#value | Приватна | Ні | Ні |
4. Чому просто "_" не підходить
До появи # розробники імітували приватність
через домовленість, ставили _ перед іменем:
class User {
_password = "12345";
}Але це не захищає:
const u = new User();
u._password = "hacked"; // Можна змінити#, це справжній захист на рівні мови,
а не просто домовленість.
5. Приватні поля і успадкування
Приватні поля не успадковуються і не доступні в підкласах:
class Parent {
#secret = "parent secret";
reveal() {
console.log(this.#secret);
}
}
class Child extends Parent {
test() {
console.log(this.#secret); // Помилка: приватне поле батьківського класу
}
}Кожен клас бачить лише свої приватні поля, навіть якщо успадковується від іншого.
6. Можна використовувати приватні статичні поля
class Config {
static #token = "abc123";
static getToken() {
return this.#token;
}
}
console.log(Config.getToken()); // "abc123"
console.log(Config.#token); // ПомилкаЦе корисно, якщо хочеш приховати конфіденційні дані рівня класу.
7. Приклад реального застосування
class BankAccount {
#balance = 0;
deposit(amount) {
if (amount <= 0) throw new Error("Amount must be positive");
this.#balance += amount;
}
withdraw(amount) {
if (amount > this.#balance) throw new Error("Insufficient funds");
this.#balance -= amount;
}
getBalance() {
return this.#balance;
}
}
const acc = new BankAccount();
acc.deposit(500);
console.log(acc.getBalance()); // 500
acc.withdraw(200);
console.log(acc.getBalance()); // 300
// acc.#balance = 100000; Помилка: не можна змінити ззовніПриватне поле #balance захищає дані від прямого втручання.
8. Неможливо створити приватну властивість динамічно
Імена приватних властивостей жорстко визначаються в коді. Ти не можеш створити їх динамічно:
const name = "#secret";
class A {
[name] = 123; // Помилка: не можна використовувати змінну
}Це зроблено для повної безпеки: доступ можливий лише за символом
#.
Підсумок
| Особливість | Приватна властивість (#field) |
|---|---|
| Видимість | Лише всередині класу |
| Оголошується | Через #ім'я |
| Доступ ззовні | Помилка (не просто undefined) |
| Успадкування | Не передається нащадкам |
| Можна використовувати в статиці | Так (static #secret) |
| Можна поєднувати з геттерами/сеттерами | Так |
| Створити динамічно | Ні |
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.