Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Приватні властивості». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Приватна властивість** класу, це властивість, ім'я якої починається із символу `#`; вона доступна лише всередині самого класу, а будь-яка спроба звернутися до неї ззовні (наприклад, `u.#password`) призводить не до `undefined`, а до синтаксичної помилки. **Ключове:** приватні поля не успадковуються й недоступні в підкласах, можуть бути статичними (`static #secret`), і їхні імена не можна створити динамічно, на відміну від застарілого підходу з префіксом `_`, який лише позначав приватність домовленістю, але нічого не захищав.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## 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`) | | Можна поєднувати з геттерами/сеттерами | Так | | Створити динамічно | Ні |Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.