Зачем создавать статические члены класса в JavaScript?
Что такое статические члены класса?
Статические (static
) свойства и методы класса принадлежат самому классу, а не его экземплярам. Это означает, что они доступны без создания объекта и не могут быть вызваны через this
внутри экземпляров.
Пример статического метода и свойства
class MathUtils {
static PI = 3.14159;
static square(num) {
return num * num;
}
}
console.log(MathUtils.PI); // 3.14159
console.log(MathUtils.square(5)); // 25
const instance = new MathUtils();
// console.log(instance.PI); // Ошибка: свойство принадлежит классу, а не объекту
Почему используют статические члены?
1. Общие утилиты и вспомогательные методы
Если метод не зависит от состояния экземпляра, его логично сделать статическим. Например, Math.random()
или Array.isArray()
.
class StringHelper {
static toUpperCase(str) {
return str.toUpperCase();
}
}
console.log(StringHelper.toUpperCase("hello")); // "HELLO"
2. Хранение глобальных данных, связанных с классом
Можно использовать статические свойства для хранения общих настроек, например, констант.
class Config {
static API_URL = "https://api.example.com";
}
console.log(Config.API_URL); // "https://api.example.com"
3. Подсчёт экземпляров класса
Можно отслеживать количество созданных объектов с помощью статического счётчика.
class User {
static count = 0;
constructor(name) {
this.name = name;
User.count++;
}
}
const user1 = new User("Alice");
const user2 = new User("Bob");
console.log(User.count); // 2
4. Реализация шаблона Singleton
Статическое свойство можно использовать для реализации паттерна Одиночка (Singleton), гарантируя, что создаётся только один объект.
class Database {
static instance = null;
constructor(connection) {
if (!Database.instance) {
this.connection = connection;
Database.instance = this;
}
return Database.instance;
}
}
const db1 = new Database("DB Connection 1");
const db2 = new Database("DB Connection 2");
console.log(db1 === db2); // true (оба объекта одинаковы)
console.log(db1.connection); // "DB Connection 1"
console.log(db2.connection); // "DB Connection 1"
Ограничения статических членов
- Их нельзя вызывать через
this
внутри экземпляра. - Они не участвуют в наследовании экземпляров, но могут быть унаследованы самим классом.
Пример наследования статических методов:
class Parent {
static greet() {
return "Hello from Parent";
}
}
class Child extends Parent {}
console.log(Child.greet()); // "Hello from Parent"
Вывод
Статические члены удобны для хранения общих данных, утилит, счётчиков и шаблонов вроде Singleton. Они помогают логически отделить методы и свойства, которые не зависят от конкретных экземпляров класса.