Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що робить ключове слово static?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**`static`** робить властивість або метод частиною самого класу, а не його екземплярів: до статичних членів звертаються через ім'я класу (`ClassName.method()`), а не через `this` в об'єкті, і звичайний екземпляр доступу до них не має. **Ключове:** статичні методи й властивості успадковуються при `extends`, а всередині статичного методу `this` вказує на сам клас, тому статику часто використовують для фабричних методів, констант і службових утиліт на кшталт `Math.random()`.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## 1. Що таке статична властивість/метод Зазвичай методи і властивості класу належать **екземплярам** (об'єктам, створеним через `new`): ```javascript class User { constructor(name) { this.name = name; // належить екземпляру } sayHi() { // теж належить екземпляру console.log(`Hi, ${this.name}`); } } const u = new User("Alice"); u.sayHi(); // Hi, Alice ``` А от якщо додати `static`: ```javascript class User { static role = "User"; static createGuest() { return new User("Guest"); } constructor(name) { this.name = name; } } console.log(User.role); // "User" console.log(User.createGuest()); // User { name: "Guest" } const u = new User("Alice"); console.log(u.role); // undefined: у екземпляра немає доступу до статики ``` **Статика доступна лише через сам клас (**`User`**)**, а не через його об'єкти (`u`). --- ## 2. Навіщо це потрібно Статичні властивості та методи використовують, коли дані або функції: - **не залежать від конкретного екземпляра**, - **спільні для всього класу**. Приклади: - фабричні методи (`User.createGuest()`), - глобальні константи (`Math.PI`), - службові утиліти (`Date.now()`). --- ## 3. Приклади вбудованих статичних методів JS сам активно використовує `static` у стандартних класах: | Клас | Статичний метод | | --- | --- | | `Math` | `Math.random()`, `Math.max()` | | `Date` | `Date.now()` | | `Object` | `Object.keys()`, `Object.assign()` | | `Array` | `Array.isArray()` | > Наприклад, ти не створюєш екземпляр `Math`, > а просто викликаєш `Math.max(1, 5, 9)`, це і є **статичний метод**. --- ## 4. Успадкування статичних методів Якщо клас успадковує інший (`extends`), то **статичні методи теж успадковуються**: ```javascript class Animal { static category = "Animals"; static info() { console.log("This is an animal"); } } class Dog extends Animal {} console.log(Dog.category); // "Animals" Dog.info(); // "This is an animal" ``` > Тобто `Dog` успадкував статику від `Animal`. --- ## 5. Статика може викликати іншу статику Усередині статичного методу можна звертатися до інших статичних властивостей через `this`: ```javascript class Counter { static count = 0; static increment() { this.count++; } static reset() { this.count = 0; } } Counter.increment(); Counter.increment(); console.log(Counter.count); // 2 Counter.reset(); console.log(Counter.count); // 0 ``` > Тут `this` усередині `static`, це **сам клас**, а не екземпляр. --- ## 6. Відмінність `static` від звичайних властивостей | Характеристика | Звичайна властивість | Статична властивість | | --- | --- | --- | | Де зберігається | У кожному екземплярі (`this`) | У самому класі (`ClassName`) | | Доступ через екземпляр | Так | Ні | | Доступ через клас | Ні | Так | | Успадковується при `extends` | Так | Так | | Контекст `this` усередині методу | Екземпляр | Клас | --- ## 7. Приклад реального використання ### Фабричний метод (factory pattern) ```javascript class User { constructor(name, role) { this.name = name; this.role = role; } static createAdmin(name) { return new User(name, "admin"); } static createGuest() { return new User("Guest", "guest"); } } const admin = User.createAdmin("Alice"); const guest = User.createGuest(); console.log(admin); // { name: "Alice", role: "admin" } console.log(guest); // { name: "Guest", role: "guest" } ``` Зручно, коли потрібно створювати об'єкти за визначеними шаблонами. --- ## 8. Можна поєднувати з приватними статичними полями ES2022 дозволяє оголошувати **приватні статичні** властивості з `#`: ```javascript class Config { static #secret = "12345"; static getSecret() { return this.#secret; } } console.log(Config.getSecret()); // "12345" console.log(Config.#secret); // SyntaxError ``` > Такі поля видно лише всередині самого класу, > навіть нащадки їх не бачать. --- ## Підсумок | Що робить `static` | Пояснення | | --- | --- | | Прив'язує властивість/метод до класу, а не до об'єктів | Доступ через `ClassName`, а не через `this` | | Часто використовується для утиліт, констант, фабрик | Наприклад, `Math.random()` | | Успадковується при `extends` | Нащадки отримують статику батьківського класу | | Усередині `static` `this` вказує на сам клас | Можна звертатися до інших статичних властивостей | | Можна зробити приватним (`static #field`) | Видно лише всередині класу | --- **Коротко:** > `static` робить властивість або метод **частиною класу**, > а не частиною його екземплярів. > Це ідеальний інструмент для спільних функцій і констант.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.