Поиск по сайту
Ctrl + K
Вопросы по JS

Зачем создавать статические члены класса в 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. Они помогают логически отделить методы и свойства, которые не зависят от конкретных экземпляров класса.