← Назад к вопросам

Что такое класс?

1.3 Junior🔥 191 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Класс в JavaScript

Класс — это шаблон для создания объектов, который определяет их структуру (свойства) и поведение (методы). Классы появились в ES6 (ES2015) как синтаксический сахар над прототипным наследованием, но они стали стандартным способом создания объектов в современном JavaScript.

Основные понятия

Класс содержит:

  • Свойства (properties) — данные, которые хранит объект
  • Методы (methods) — функции, которые объект может выполнять
  • Конструктор — специальный метод для инициализации объекта

Синтаксис класса

class User {
  // Свойства класса
  name: string;
  email: string;
  age: number;

  // Конструктор — вызывается при создании объекта
  constructor(name: string, email: string, age: number) {
    this.name = name;
    this.email = email;
    this.age = age;
  }

  // Методы класса
  greet(): string {
    return `Hello, I am ${this.name}`;
  }

  isAdult(): boolean {
    return this.age >= 18;
  }
}

// Создание объекта (экземпляра класса)
const user = new User('Alice', 'alice@example.com', 25);
console.log(user.greet()); // "Hello, I am Alice"
console.log(user.isAdult()); // true

Свойства класса

Публичные свойства (public) — доступны везде:

class Person {
  public name: string; // явно публичное
  name: string;        // по умолчанию публичное
}

const person = new Person();
person.name = 'John'; // доступно

Приватные свойства (private) — доступны только внутри класса:

class User {
  private password: string;

  constructor(password: string) {
    this.password = password;
  }

  checkPassword(input: string): boolean {
    return this.password === input; // доступно внутри класса
  }
}

const user = new User('secret123');
console.log(user.password); // Ошибка: private field

Защищённые свойства (protected) — доступны в классе и подклассах:

class Animal {
  protected species: string;

  constructor(species: string) {
    this.species = species;
  }
}

class Dog extends Animal {
  bark() {
    console.log(`${this.species} barks`); // доступно в подклассе
  }
}

Методы класса

Обычные методы — функции, привязанные к объекту:

class Calculator {
  add(a: number, b: number): number {
    return a + b;
  }
}

const calc = new Calculator();
console.log(calc.add(5, 3)); // 8

Getter и Setter — специальные методы для доступа к свойствам:

class BankAccount {
  private _balance: number = 0;

  // Getter
  get balance(): number {
    return this._balance;
  }

  // Setter
  set balance(amount: number) {
    if (amount < 0) {
      throw new Error('Balance cannot be negative');
    }
    this._balance = amount;
  }
}

const account = new BankAccount();
account.balance = 100; // вызывает setter
console.log(account.balance); // 100, вызывает getter

Статические методы — методы класса, не требующие экземпляра:

class Math {
  static PI = 3.14159;

  static calculateCircleArea(radius: number): number {
    return Math.PI * radius * radius;
  }
}

console.log(Math.calculateCircleArea(5)); // не нужно создавать new Math()

Наследование

Один класс может наследовать от другого с помощью ключевого слова extends:

class Animal {
  name: string;

  constructor(name: string) {
    this.name = name;
  }

  makeSound(): void {
    console.log('Some generic sound');
  }
}

class Dog extends Animal {
  breed: string;

  constructor(name: string, breed: string) {
    super(name); // вызов конструктора родителя
    this.breed = breed;
  }

  // Переопределение метода
  makeSound(): void {
    console.log('Woof!');
  }

  getInfo(): string {
    return `${this.name} is a ${this.breed}`;
  }
}

const dog = new Dog('Rex', 'Labrador');
dog.makeSound(); // "Woof!"
console.log(dog.getInfo()); // "Rex is a Labrador"

Абстрактные классы

Абстрактный класс — это класс, который нельзя создавать напрямую, он только для наследования:

abstract class Vehicle {
  abstract makeSound(): void; // абстрактный метод

  describe(): void {
    console.log('I am a vehicle');
  }
}

class Car extends Vehicle {
  makeSound(): void {
    console.log('Honk!');
  }
}

const car = new Car();
car.makeSound(); // "Honk!"
const vehicle = new Vehicle(); // Ошибка: cannot instantiate abstract class

Интерфейсы и классы

Класс может реализовывать интерфейс с помощью implements:

interface Drawable {
  draw(): void;
}

class Circle implements Drawable {
  draw(): void {
    console.log('Drawing a circle');
  }
}

const circle = new Circle();
circle.draw(); // "Drawing a circle"

Пример: Реальное применение

class UserRepository {
  private users: User[] = [];

  addUser(user: User): void {
    this.users.push(user);
  }

  getUserById(id: number): User | undefined {
    return this.users.find(u => u.id === id);
  }

  getAllUsers(): User[] {
    return this.users;
  }
}

class User {
  id: number;
  name: string;
  email: string;

  constructor(id: number, name: string, email: string) {
    this.id = id;
    this.name = name;
    this.email = email;
  }
}

const repo = new UserRepository();
repo.addUser(new User(1, 'Alice', 'alice@example.com'));
repo.addUser(new User(2, 'Bob', 'bob@example.com'));

console.log(repo.getUserById(1)?.name); // "Alice"

Когда использовать классы

Используй классы для:

  • Объектно-ориентированного проектирования
  • Создания переиспользуемых компонентов
  • Организации кода с наследованием
  • Работы с дизайн-паттернами (Singleton, Factory и т.д.)

Когда функции достаточно:

  • Простая логика без состояния
  • Функциональное программирование
  • Маленькие утилиты

Классы vs Функции

В React современный подход — функциональные компоненты, но в бизнес-логике классы остаются полезны для организации кода и наследования.