Кратко
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 — как инструменты в мастерской. Экземпляр — как готовый стул. Статический метод — как дрель (она не принадлежит ни одному стулу, но принадлежит мастерской/классу).
Примеры
**Самый простой:**
class Counter {
static count = 0;
constructor() {
Counter.count++;
}
}
new Counter();
new Counter();
console.log(Counter.count); // 2Статическое свойство принадлежит классу, не экземплярам.
**Простой:**
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().
**Реальный пример:**
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 для проверки типа.