Как использовать классы в 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 предоставляют удобный способ управления данными и поведением объектов. Правильное использование модификаторов доступа, приватных полей и современных возможностей позволяет создавать надёжный и понятный код.
Итоги:
- Классы структурируют данные и логику.
- Модификаторы доступа защищают данные от нежелательного вмешательства.
- Композиция часто предпочтительнее глубоких иерархий наследования.
Применяйте классы с учётом этих рекомендаций, чтобы ваш код был понятным, масштабируемым и надёжным!