Що робить ключове слово static?
1. Що таке статична властивість/метод
Зазвичай методи і властивості класу належать екземплярам (об'єктам, створеним через new):
class User {
constructor(name) {
this.name = name; // належить екземпляру
}
sayHi() { // теж належить екземпляру
console.log(`Hi, ${this.name}`);
}
}
const u = new User("Alice");
u.sayHi(); // Hi, AliceА от якщо додати static:
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), то статичні методи теж успадковуються:
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:
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)
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 дозволяє оголошувати приватні статичні властивості з #:
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робить властивість або метод частиною класу, а не частиною його екземплярів. Це ідеальний інструмент для спільних функцій і констант.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.