DevSurge 💦

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

Cover Image for Как использовать классы в JavaScript

Классы — это один из ключевых инструментов, предоставляемых TypeScript для работы с объектами. Они позволяют создавать объекты с общими свойствами и методами, улучшая структуру и читаемость кода. В этой статье вы узнаете, как использовать классы и в каких ситуациях они применяются.

Основы работы с классами

Класс — это шаблон, который описывает структуру данных и их поведение.

Пример базового класса:

/**
 * Представляет животное с именем и базовым поведением.
 */
class Animal {
  name: string;

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

  /**
   * Выводит звук, издаваемый животным.
   */
  speak(): void {
    console.log(`${this.name} издает звук`);
  }
}

const dog = new Animal("Собака");
dog.speak(); // "Собака издает звук"

Инкапсуляция с модификаторами доступа

TypeScript позволяет использовать модификаторы public, private и protected для управления доступом к свойствам и методам.

Пример:

/**
 * Представляет автомобиль с базовыми свойствами и поведением.
 */
class Car {
  private speed: number = 0; // Скорость доступна только внутри класса
  protected fuel: number; // Топливо доступно в классе и его наследниках

  constructor(public brand: string, fuel: number) {
    this.fuel = fuel;
  }

  /**
   * Увеличивает скорость автомобиля.
   * @param amount - Увеличение скорости в км/ч
   */
  accelerate(amount: number): void {
    this.speed += amount;
    console.log(`${this.brand} разогнался до ${this.speed} км/ч`);
  }
}

const car = new Car("Toyota", 50);
car.accelerate(20);
// car.speed = 100; // Ошибка: свойство speed недоступно

Современные возможности: приватные поля

С JavaScript (и TypeScript) можно использовать настоящие приватные поля с синтаксисом #.

/**
 * Представляет человека с приватным именем.
 */
class Person {
  #name: string;

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

  /**
   * Возвращает имя человека.
   */
  getName(): string {
    return this.#name;
  }
}

const person = new Person("Alice");
console.log(person.getName()); // 'Alice'
// console.log(person.#name); // Ошибка: свойство недоступно

Лучшие практики

Используйте приватные поля для защиты данных.
Приватные поля (#) обеспечивают настоящую инкапсуляцию, гарантируя, что данные объекта недоступны напрямую.

Создавайте только необходимые методы и свойства.
Не перегружайте классы функциями. Добавляйте только то, что имеет непосредственное отношение к сущности.

Избегайте глубоких иерархий наследования.
Если требуется сложная структура, рассмотрите композицию вместо наследования.

Используйте абстрактные классы для общих шаблонов.
Абстрактные классы подходят для определения базового поведения, которое нужно переопределить в наследниках.

Пример композиции вместо наследования:

/**
 * Добавляет возможность логирования.
 */
class Logger {
  log(message: string): void {
    console.log(`[LOG]: ${message}`);
  }
}

/**
 * Представляет устройство, которое использует логирование.
 */
class Device {
  private logger = new Logger();

  constructor(public name: string) {}

  /**
   * Логирует действие устройства.
   * @param action - Описание действия
   */
  performAction(action: string): void {
    this.logger.log(`${this.name} выполняет действие: ${action}`);
  }
}

const phone = new Device("Телефон");
phone.performAction("звонок"); // [LOG]: Телефон выполняет действие: звонок

Заключение

Классы в TypeScript предоставляют удобный способ управления данными и поведением объектов. Правильное использование модификаторов доступа, приватных полей и современных возможностей позволяет создавать надёжный и понятный код.

Итоги:

  1. Классы структурируют данные и логику.
  2. Модификаторы доступа защищают данные от нежелательного вмешательства.
  3. Композиция часто предпочтительнее глубоких иерархий наследования.

Применяйте классы с учётом этих рекомендаций, чтобы ваш код был понятным, масштабируемым и надёжным!


Другие материалы