Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Класс в 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 современный подход — функциональные компоненты, но в бизнес-логике классы остаются полезны для организации кода и наследования.