Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що робить ключове слово static?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Ключове слово **`static`** робить властивість чи метод належними самому класу, а не його екземпляру, тому доступ до них здійснюється через ім'я класу (`MyClass.member`), а не через `new`-об'єкт. **Ключове:** статичні члени успадковуються, можуть бути `private`/`protected`/`readonly`, і всередині класу до них звертаються через ім'я класу, а не через `this`.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## 1. Основна ідея Зазвичай методи і властивості створюються для **екземпляра класу** (через `new`): ```javascript class User { name: string; constructor(name: string) { this.name = name; } greet() { console.log(`Hello, ${this.name}!`); } } const u = new User("Tim"); u.greet(); // Hello, Tim! ``` А от `static` робить властивість **доступною лише через сам клас**, а не через об'єкт: ```javascript class User { static role = "user"; // статична властивість } console.log(User.role); // доступ через клас // console.log(u.role); // Помилка - у екземпляра немає властивості role ``` --- ## 2. Приклад: статичні методи ```javascript class MathUtils { static sum(a: number, b: number): number { return a + b; } static multiply(a: number, b: number): number { return a * b; } } console.log(MathUtils.sum(3, 4)); // 7 console.log(MathUtils.multiply(3, 4)); // 12 ``` Такі методи можна викликати **без створення екземпляра** - це "глобальні функції", згруповані в клас. --- ## 3. Відмінність від звичайних методів | Характеристика | Звичайний метод | `static` метод | |---|---|---| | Належить | екземпляру (`new MyClass()`) | самому класу (`MyClass`) | | Доступ з екземпляра | Так | Ні | | Доступ через клас | Ні | Так | | Має доступ до `this` (екземпляра) | Так | Ні (лише до класу) | --- ## Приклад порівняння ```javascript class Counter { static count = 0; // спільне для всіх instanceCount = 0; // індивідуальне constructor() { Counter.count++; this.instanceCount++; } static reset() { Counter.count = 0; } } const c1 = new Counter(); const c2 = new Counter(); console.log(Counter.count); // 2 (спільне) console.log(c1.instanceCount); // 1 console.log(c2.instanceCount); // 1 Counter.reset(); console.log(Counter.count); // 0 ``` > `Counter.count` - спільне поле для всіх екземплярів, > а `this.instanceCount` - унікальне для кожного об'єкта. --- ## 4. Статичні властивості та методи можуть бути типізовані ```javascript class Config { static readonly API_URL: string = "https://api.example.com"; static version: number = 1.0; static getInfo(): string { return `Version: ${Config.version}`; } } console.log(Config.API_URL); console.log(Config.getInfo()); ``` > Можна використовувати модифікатори (`public`, `private`, `readonly`) разом зі `static`. --- ## 5. `static` + `private` Статичні члени можуть бути **приватними**, тобто доступними лише всередині самого класу: ```javascript class Database { private static connection: string; static connect(url: string) { Database.connection = url; console.log(`Connected to ${url}`); } static getConnection() { return Database.connection; } } Database.connect("mongodb://localhost"); console.log(Database.getConnection()); // доступ через публічний static // Database.connection; // private ``` --- ## 6. Доступ до статичних членів усередині класу Усередині класу звертатися потрібно **через ім'я класу**, а не через `this`: ```javascript class Example { static count = 0; increment() { // this.count++; // помилка - немає в екземпляра Example.count++; // коректно } } ``` > `this` усередині звичайного методу посилається на **екземпляр**, > а статичні поля належать **класу**. --- ## 7. Статичні блоки (ES2022 / TS 4.4+) TypeScript підтримує **static blocks** - код, який виконується **один раз під час завантаження класу**. ```javascript class Settings { static config = {}; static { console.log("Initializing Settings..."); Settings.config = { mode: "prod" }; } } console.log(Settings.config); // { mode: "prod" } ``` > Це зручно для ініціалізації статичних даних, які не повинні бути всередині конструктора. --- ## 8. Успадкування статичних членів Статичні властивості та методи **успадковуються**: ```javascript class Base { static type = "base"; static describe() { console.log(`Type: ${this.type}`); } } class Child extends Base { static type = "child"; } Base.describe(); // Type: base Child.describe(); // Type: child ``` > `this` у статичному методі вказує на **сам клас**, > а не на батька. --- ## Підсумок | Можливість | Опис | |---|---| | `static` | Робить властивість/метод такими, що належать класу, а не екземпляру | | Де використовується | Усередині класів | | Доступ | Через ім'я класу (`MyClass.member`) | | Успадковується | Так | | Може бути `private` / `protected` / `readonly` | Так | | Доступ до них з екземпляра | Ні | | Підтримує блоки `static {}` та ініціалізацію | Так (TS 4.4+) | --- **Простіше кажучи:** > `static` робить метод або властивість "спільними" для всього класу, > а не для конкретного об'єкта. > > Чудово підходить для **утиліт**, **констант**, **лічильників**, **фабрик** і **ініціалізації**.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.