Skip to main content

Приватні властивості

1. Що таке приватна властивість

Приватна властивість, це властивість класу, що починається із символу #. Вона доступна лише всередині самого класу, а ззовні повністю недоступна (і навіть не видна).

javascript
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. Приватні методи

Можна приховувати не лише властивості, а й методи:

javascript
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. Чому просто "_" не підходить

До появи # розробники імітували приватність через домовленість, ставили _ перед іменем:

javascript
class User { _password = "12345"; }

Але це не захищає:

javascript
const u = new User(); u._password = "hacked"; // Можна змінити

#, це справжній захист на рівні мови, а не просто домовленість.


5. Приватні поля і успадкування

Приватні поля не успадковуються і не доступні в підкласах:

javascript
class Parent { #secret = "parent secret"; reveal() { console.log(this.#secret); } } class Child extends Parent { test() { console.log(this.#secret); // Помилка: приватне поле батьківського класу } }

Кожен клас бачить лише свої приватні поля, навіть якщо успадковується від іншого.


6. Можна використовувати приватні статичні поля

javascript
class Config { static #token = "abc123"; static getToken() { return this.#token; } } console.log(Config.getToken()); // "abc123" console.log(Config.#token); // Помилка

Це корисно, якщо хочеш приховати конфіденційні дані рівня класу.


7. Приклад реального застосування

javascript
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. Неможливо створити приватну властивість динамічно

Імена приватних властивостей жорстко визначаються в коді. Ти не можеш створити їх динамічно:

javascript
const name = "#secret"; class A { [name] = 123; // Помилка: не можна використовувати змінну }

Це зроблено для повної безпеки: доступ можливий лише за символом #.


Підсумок

ОсобливістьПриватна властивість (#field)
ВидимістьЛише всередині класу
ОголошуєтьсяЧерез #ім'я
Доступ ззовніПомилка (не просто undefined)
УспадкуванняНе передається нащадкам
Можна використовувати в статиціТак (static #secret)
Можна поєднувати з геттерами/сеттерамиТак
Створити динамічноНі

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.