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

Зачем нужны статические методы и свойства? 🤔

Представь, что ты пишешь класс User и хочешь добавить функцию, которая проверяет, является ли переданный объект экземпляром User. Можно, конечно, сделать метод в классе:

class User {
  isUser(obj) {
    return obj instanceof User;
  }
}

Но тогда придётся создавать экземпляр User просто для вызова этой функции:

const user = new User();
user.isUser(someObj); // 🤨 Неудобно!

А что, если метод не требует экземпляра и относится ко всему классу? Для этого и нужны статические методы и свойства!

Как объявить статический метод? 🌟

Используй ключевое слово static:

class User {
  static isUser(obj) {
    return obj instanceof User;
  }
}

Теперь метод можно вызвать на самом классе, а не на его экземпляре:

User.isUser(someObj); // ✅ Чисто и элегантно!

💡 Кстати: Статические методы часто используют для утилитарных функций, которые логически относятся к классу, но не зависят от конкретного экземпляра.

Статические свойства — тоже возможно! 🎯

Ты можешь добавить в класс статическое свойство — оно будет доступно без создания экземпляра:

class Settings {
  static defaultTheme = "dark";
}

console.log(Settings.defaultTheme); // "dark"

Это удобно для хранения констант или общих настроек.

Пример из реального мира: Math и JSON

Давай взглянем на встроенные классы JavaScript:

Math.random();       // Статический метод  
JSON.parse('{}');    // Тоже статический метод  

Они работают без new, потому что не требуют экземпляра. Если бы Math был обычным классом, пришлось бы писать так:

const math = new Math(); // 😱 Бред!  
math.random();  

К счастью, JavaScript разработчики сделали Math.random() статическим, и теперь мы можем использовать его напрямую.

Где ещё полезны статические методы? 🏗️

1. Фабричные методы

Статические методы могут создавать экземпляры класса с дополнительной логикой:

class Car {
  constructor(model) {
    this.model = model;
  }

  static createTesla() {
    return new Car("Tesla Model 3");
  }
}

const tesla = Car.createTesla(); // Создаём машину без `new Car()`
console.log(tesla.model); // "Tesla Model 3"

2. Валидация данных

Можно проверять данные перед созданием объекта:

class User {
  static isValidEmail(email) {
    return email.includes("@");
  }

  constructor(email) {
    if (!User.isValidEmail(email)) {
      throw new Error("Invalid email!");
    }
    this.email = email;
  }
}

const user = new User("test@example.com"); // ✅  
const badUser = new User("invalid-email"); // ❌ Ошибка!

А что с наследованием? 🧬

Статические методы и свойства наследуются:

class Animal {
  static planet = "Earth";

  static getPlanet() {
    return this.planet;
  }
}

class Dog extends Animal {}

console.log(Dog.planet); // "Earth"  
console.log(Dog.getPlanet()); // "Earth"  

⚠️ Важно: Внутри статического метода this ссылается на класс, а не на экземпляр.

Когда не стоит использовать статику? 🚫

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

class User {
  name = "Danila";

  static getName() {
    return this.name; // ❌ Не сработает!
  }
}

User.getName(); // undefined  

Если метод должен работать с данными объекта — делай его обычным, а не статическим.


Итог: ключевые моменты 🏁

✔️ Статические методы и свойства принадлежат классу, а не экземплярам.
✔️ Объявляются через ключевое слово static.
✔️ Полезны для фабричных методов, валидации, утилитарных функций.
✔️ Наследуются дочерними классами.
✔️ Не заменяют обычные методы — они для разных задач!

Теперь ты знаешь, как использовать статику в классах JavaScript. Попробуй применить это в своём коде — и увидишь, как он станет чище и удобнее! 🚀

Скрыть рекламу навсегда

📘 VK Видео — обучение без ограничений

Все уроки доступны без VPN, без блокировок и зависаний.

Можно смотреть с телефона, планшета или компьютера — в любое время.

▶️ Смотреть на VK Видео