Что такое класс в JavaScript

Что такое класс в JavaScript

Технический фундамент class в JS

class в JavaScript это специальный синтаксис для работы с прототипами:

  • методы класса попадают в prototype, а не копируются в каждый объект;
  • конструктор инициализирует экземпляр, созданный через new;
  • класс исполняется в strict mode, что уменьшает число неявных ошибок;
  • объявление класса не "всплывает" как function declaration (есть temporal dead zone).

Это объясняет, почему классы удобны для читаемой архитектуры, но остаются частью прототипной системы JS.

Почему классы добавили в JavaScript

До появления синтаксиса class в JavaScript ООП-подход строили через функции-конструкторы и прототипы. Это работало, но читалось сложнее для новичков и команд. class сделал запись более понятной и похожей на привычную модель "шаблон + экземпляры".

Ключевой момент: class в JavaScript это синтаксический сахар над прототипной моделью, а не отдельная система объектов.

Проверь себя: что значит "синтаксический сахар" в контексте class?

Что такое класс простыми словами

Класс это шаблон, по которому создаются объекты одного типа.

  • класс описывает общую структуру;
  • экземпляр (instance) это конкретный объект, созданный по шаблону.
class User {
  constructor(name) {
    this.name = name;
  }
}

const user1 = new User('Анна');
const user2 = new User('Игорь');

console.log(user1.name); // Анна
console.log(user2.name); // Игорь

Смотри, что важно: user1 и user2 независимы, но имеют одинаковую структуру, заданную классом User.

Синтаксис класса: минимальный набор

  • class ClassName { ... } - объявление класса;
  • constructor(...) - специальный метод инициализации;
  • new ClassName(...) - создание экземпляра;
  • this - ссылка на текущий экземпляр.

Здесь часто путаются: вызвать класс как обычную функцию нельзя, нужно именно new.

class Product {}

const p = Product(); // TypeError

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

class Product {}
const p = new Product();
console.log(p instanceof Product); // true

Смотри, что важно: классы не "всплывают". Нельзя использовать класс до его объявления (будет ошибка из-за temporal dead zone).

// new User(); // ReferenceError
class User {}

Проверь себя: почему без new JavaScript не создает экземпляр класса?

Как класс помогает в реальных задачах

  1. Сущность пользователя.

Класс User задает единый формат профиля: имя, email, роль, базовые действия.

  1. Товар в каталоге.

Класс Product хранит цену, скидку, остаток и методы для расчетов.

  1. Управление задачами.

Класс Task хранит статус и методы изменения состояния.

class Task {
  constructor(title) {
    this.title = title;
    this.done = false;
  }
}

Вместо копипаста структур по всему проекту ты получаешь централизованный шаблон.

Экземпляры и общая логика

Каждый экземпляр хранит свои данные, но использует одну общую логику класса.

Это снижает дублирование: тебе не нужно вручную добавлять одинаковые функции в каждый объект.

class Counter {
  constructor() {
    this.value = 0;
  }

  inc() {
    this.value += 1;
  }
}

Дополнительный пример: метод класса общий для всех экземпляров через prototype.

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

  getName() {
    return this.name;
  }
}

const a = new User('А');
const b = new User('Б');
console.log(a.getName === b.getName); // true

Новый термин: экземпляр класса - объект, созданный через new по шаблону класса.

Частые ошибки новичков

  • Забывать new при создании экземпляра.
  • Путать класс (шаблон) и объект (конкретный экземпляр).
  • Давать классу слишком много ответственности.
  • Использовать class, когда хватило бы простого объекта.

Анти-провал: если класс начинает описывать "всё сразу", разбей модель на несколько сущностей.

Что будет, если изменить входные данные

Если в new User(name) передать пустую строку, объект создастся, но данные будут плохими. Значит, сам класс не гарантирует валидность входа без дополнительных проверок. Это особенно важно в продуктовых формах.

Проверь себя: где логичнее проверять вход name - в constructor или до создания экземпляра?

Краткий итог

  • Класс в JavaScript это шаблон для создания однотипных объектов.
  • Синтаксис class упрощает чтение ООП-кода и работу в команде.
  • Экземпляры создаются только через new.
  • Класс не отменяет необходимость валидации и разделения ответственности.
  • Хороший класс делает код более предсказуемым и переиспользуемым.