JS Intermediate

Статические методы и свойства

Понять разницу между методами экземпляра и статическими методами класса, и когда каждые нужны.

Средний (Intermediate)
Нужно знать:Классы

Кратко

static method — метод класса, вызываемый через ClassName.method(), а не через экземпляр. static property — свойство класса, а не экземпляра. Статические методы полезны для фабрик, утилит и методов, не привязанных к экземпляру.


Подробно

Static методы: class MathHelper { static add(a, b) { return a + b; } }

MathHelper.add(2, 3); // 5 // const m = new MathHelper(); // m.add(2, 3); // Ошибка! add — статический

Static vs Instance:

  • Instance: привязан к конкретному объекту
  • Static: привязан к классу

Когда использовать static:

  • Фабричные методы: User.create()
  • Утилиты: Array.from()
  • Вспомогательные функции

Static properties: class Config { static MAX_RETRIES = 3; static API_URL = 'https://api.example.com'; }

Static в наследовании: class Animal { static create(name) { return new this(name); } }

class Dog extends Animal {} const rex = Dog.create('Рекс'); // работает!


Ментальная модель

Static — как инструменты в мастерской. Экземпляр — как готовый стул. Статический метод — как дрель (она не принадлежит ни одному стулу, но принадлежит мастерской/классу).


Примеры

**Самый простой:**

javascript
class Counter {
  static count = 0;

  constructor() {
    Counter.count++;
  }
}

new Counter();
new Counter();
console.log(Counter.count); // 2

Статическое свойство принадлежит классу, не экземплярам.

**Простой:**

javascript
class User {
  constructor(name, email) {
    this.name = name;
    this.email = email;
  }

  static create(data) {
    return new User(data.name, data.email);
  }
}

const user = User.create({ name: 'Анна', email: 'anna@test.com' });
console.log(user.name); // 'Анна'

Фабричный метод: User.create() вместо new User().

**Реальный пример:**

javascript
class Validators {
  static isEmail(value) {
    return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value);
  }

  static isPositive(value) {
    return typeof value === 'number' && value > 0;
  }

  static minLength(value, min) {
    return typeof value === 'string' && value.length >= min;
  }
}

console.log(Validators.isEmail('test@test.com')); // true
console.log(Validators.isPositive(-5)); // false

Статический утилитный класс — коллекция проверок.


Частые ошибки

**Неправильно:** Вызывать static метод через this в не-static контексте

**Почему:** this в instance method ссылается на экземпляр, не на класс.

**Правильно:** Используйте ClassName.method() или this.constructor.method().

**Неправильно:** Использовать static для методов экземпляра

**Почему:** Static методы не имеют доступа к this экземпляра.

**Правильно:** Если методу нужен экземпляр — это instance method.

**Неправильно:** Думать, что static = приватный

**Почему:** Static — это « принадлежит классу », не « скрыт ». Доступен через ClassName.method().

**Правильно:** Static ≠ private. Для приватности используйте #.


Важно запомнить

  • static method — вызывается через ClassName.method()
  • static property — принадлежит классу, не экземпляру
  • Фабричные методы — традиционный use case
  • Static методы не имеют доступа к this экземпляра
  • Static наследуется дочерними классами

Связь

Назад: Вы знаете классы и приватные поля (JI8-JI10) — теперь у вас есть возможности уровня класса.

Вперёд: Следующий урок (JI12) — instanceof для проверки типа.

Материалы курса JS Intermediate — PROlab Academy.