Классы и объектно-ориентированное программирование
Статья кажется очень большой, но в основном из-за кода. Дочитайте до конца. Материал важный и интересный.
Объектно-ориентированное программирование позволяет структурировать код таким образом, чтобы он был легко читаемым, расширяемым и поддерживаемым. Одним из ключевых элементов ООП являются классы, которые позволяют создавать объекты с общими свойствами и методами.
В этой статье мы рассмотрим основы работы с классами в JavaScript, а также такие важные концепции, как наследование и полиморфизм. Мы также обсудим работу с объектами и их использование в контексте ООП.
Классы в ES6
До появления стандарта ES6 (ECMAScript 2015) в JavaScript не было встроенной поддержки классов. Вместо этого использовались функции-конструкторы и прототипы. Однако с введением синтаксиса классов работа с ними стала значительно проще и удобнее.
Создание класса
Класс в JavaScript создается с помощью ключевого слова class. Внутри класса определяются свойства и методы:
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
return `Hello, my name is ${this.name}`;
}
}
Создание экземпляра класса
Чтобы создать экземпляр класса, нужно использовать оператор new:
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
return `Hello, my name is ${this.name}`;
}
}
const person = new Person('John', 30);
console.log(person.greet()); // Hello, my name is John
Статические методы и свойства
Кроме обычных методов, классы могут содержать статические методы и свойства. Они принадлежат классу, а не конкретным экземплярам:
class MathHelper {
static PI = 3.14;
static calculateCircumference(radius) {
return 2 * MathHelper.PI * radius;
}
}
console.log(MathHelper.calculateCircumference(5)); // 31.400000000000002
Наследование и полиморфизм
Одним из основных принципов ООП является наследование. Оно позволяет одному классу унаследовать свойства и методы другого класса. В JavaScript это делается с помощью ключевого слова extends.
Простое наследование
Рассмотрим пример простого наследования:
class Animal {
constructor(name) {
this.name = name;
}
makeSound() {
console.log(`${this.name} makes a sound.`);
}
}
class Dog extends Animal {
makeSound() {
super.makeSound();
console.log(`${this.name} barks!`);
}
}
const dog = new Dog('Buddy');
dog.makeSound(); // Buddy makes a sound. Buddy barks!
В этом примере класс Dog наследует все свойства и методы класса Animal. Метод makeSound() переопределен в классе Dog, но при этом вызывается метод родительского класса с помощью super.
Полиморфизм
Полиморфизм означает возможность одного и того же метода вести себя по-разному в зависимости от контекста. Рассмотрим пример:
Расчёт площади прямоугольника.
Она рассчитывается как произведение ширины на высоту:
Площадь прямоугольника = ширина×высота
Для вашего примера ширина прямоугольника =5, высота прямоугольника = 10, радиус круга =7
Площадь прямоугольника=5×10=50
Площадь круга рассчитывается по формуле:
Площадь круга=π × радиус^2
Где π равно 3.14159. Для вашего примера:
Площадь круга=3.14159×7^2=153.93804
Теперь сложим эти две площади вместе:
Общая площадь=50+153.93804=203.93804
Таким образом, правильный ответ:
203.93804
Поэтому вывод в консоли будет:
203.93804
Этот результат соответствует правильному расчету общей площади прямоугольника и круга.
Теперь давайте напишем код:
class Shape {
area() {
throw new Error('Method not implemented.');
}
}
class Rectangle extends Shape {
constructor(width, height) {
super();
this.width = width;
this.height = height;
}
area() {
return this.width * this.height;
}
}
class Circle extends Shape {
constructor(radius) {
super();
this.radius = radius;
}
area() {
return Math.PI * this.radius ** 2;
}
}
function calculateTotalArea(shapes) {
return shapes.reduce((total, shape) => total + shape.area(), 0);
}
const rectangle = new Rectangle(5, 10);
const circle = new Circle(7);
const shapes = [rectangle, circle];
console.log(calculateTotalArea(shapes)); // 203.93804002589985
В этом примере метод area() определен в базовом классе Shape, но реализован по-разному в дочерних классах Rectangle и Circle. Функция calculateTotalArea() может работать с любым объектом, который реализует интерфейс Shape, независимо от конкретного типа фигуры.
Работа с объектами
Объекты в JavaScript представляют собой коллекции свойств и методов. Они могут быть созданы различными способами:
Литеральный способ
Самый простой способ создания объектов – это использование литерального синтаксиса:
const person = {
name: 'Jane',
age: 25,
greet: function() {
return `Hello, my name is ${this.name}`;
}
};
console.log(person.greet()); // Hello, my name is Jane
Конструктор функций
Он использовался до введения классов в ES6:
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
Car.prototype.getInfo = function() {
return `${this.make} ${this.model}, ${this.year}`;
};
const car = new Car('Toyota', 'Corolla', 2020);
console.log(car.getInfo()); // Toyota Corolla, 2020
Деструктуризация объектов
JavaScript поддерживает деструктуризацию объектов, которая позволяет извлекать значения из объектов:
const user = { name: ‘Alice’, age: 28 };
const { name, age } = user;
console.log(name); // Alice
console.log(age); // 28
Вот несколько практических примеров программ на JavaScript, которые демонстрируют применение классов, наследования, полиморфизма и работы с объектами в реальных задачах.
Система управления библиотекой книг
Эта программа представляет собой простую систему управления библиотекой книг. Она включает в себя классы для представления книг, авторов и библиотеки, а также методы для добавления, удаления и поиска книг.
// Класс Book
class Book {
constructor(title, author, isbn) {
this.title = title;
this.author = author;
this.isbn = isbn;
}
getTitle() {
return this.title;
}
setTitle(newTitle) {
this.title = newTitle;
}
getAuthor() {
return this.author;
}
setAuthor(newAuthor) {
this.author = newAuthor;
}
getIsbn() {
return this.isbn;
}
setIsbn(newIsbn) {
this.isbn = newIsbn;
}
toString() {
return `${this.title} by ${this.author} (ISBN: ${this.isbn})`;
}
}
// Класс Author
class Author {
constructor(name, birthYear) {
this.name = name;
this.birthYear = birthYear;
}
getName() {
return this.name;
}
setName(newName) {
this.name = newName;
}
getBirthYear() {
return this.birthYear;
}
setBirthYear(newBirthYear) {
this.birthYear = newBirthYear;
}
toString() {
return `${this.name} (${this.birthYear})`;
}
}
// Класс Library
class Library {
constructor(name) {
this.name = name;
this.books = [];
}
addBook(book) {
if (!(book instanceof Book)) {
throw new TypeError('Argument must be an instance of Book');
}
this.books.push(book);
}
removeBook(isbn) {
const index = this.books.findIndex(book => book.isbn === isbn);
if (index !== -1) {
this.books.splice(index, 1);
}
}
findBooksByAuthor(authorName) {
return this.books.filter(book => book.author === authorName);
}
listAllBooks() {
return this.books.map(book => book.toString());
}
}
// Использование системы управления библиотекой
const library = new Library('Main Library');
const tolkien = new Author('J.R.R. Tolkien', 1892);
const rowling = new Author('J.K. Rowling', 1965);
const lotr = new Book('The Lord of the Rings', tolkien, '978-0618640157');
const hp1 = new Book('Harry Potter and the Philosopher\'s Stone', rowling, '978-0747532699');
library.addBook(lotr);
library.addBook(hp1);
console.log('All books:');
console.log(library.listAllBooks().join('\n'));
console.log('\nBooks by J.K. Rowling:');
console.log(library.findBooksByAuthor(rowling).map(book => book.toString()).join('\n'));
library.removeBook('978-0618640157');
console.log('\nRemaining books after removing The Lord of the Rings:');
console.log(library.listAllBooks().join('\n'));
Программа для ведения учёта студентов и преподавателей
Эта программа использует классы для представления студентов и преподавателей, а также методы для добавления, удаления и поиска записей.
// Класс Student
class Student {
constructor(firstName, lastName, studentId) {
this.firstName = firstName;
this.lastName = lastName;
this.studentId = studentId;
}
getFullName() {
return `${this.firstName} ${this.lastName}`;
}
getStudentId() {
return this.studentId;
}
toString() {
return `${this.getFullName()} (ID: ${this.studentId})`;
}
}
// Класс Teacher
class Teacher {
constructor(firstName, lastName, subject) {
this.firstName = firstName;
this.lastName = lastName;
this.subject = subject;
}
getFullName() {
return `${this.firstName} ${this.lastName}`;
}
getSubject() {
return this.subject;
}
toString() {
return `${this.getFullName()} teaches ${this.subject}.`;
}
}
// Класс School
class School {
constructor(name) {
this.name = name;
this.students = [];
this.teachers = [];
}
addStudent(student) {
if (!(student instanceof Student)) {
throw new TypeError('Argument must be an instance of Student');
}
this.students.push(student);
}
addTeacher(teacher) {
if (!(teacher instanceof Teacher)) {
throw new TypeError('Argument must be an instance of Teacher');
}
this.teachers.push(teacher);
}
removeStudent(studentId) {
const index = this.students.findIndex(student => student.studentId === studentId);
if (index !== -1) {
this.students.splice(index, 1);
}
}
removeTeacher(fullName) {
const index = this.teachers.findIndex(teacher => teacher.getFullName() === fullName);
if (index !== -1) {
this.teachers.splice(index, 1);
}
}
listStudents() {
return this.students.map(student => student.toString());
}
listTeachers() {
return this.teachers.map(teacher => teacher.toString());
}
}
// Использование программы для ведения учёта студентов и преподавателей
const school = new School('High School');
const john = new Student('John', 'Doe', '12345');
const jane = new Student('Jane', 'Smith', '67890');
const mathTeacher = new Teacher('Mary', 'Johnson', 'Mathematics');
const historyTeacher = new Teacher('David', 'Brown', 'History');
school.addStudent(john);
school.addStudent(jane);
school.addTeacher(mathTeacher);
school.addTeacher(historyTeacher);
console.log('Students:');
console.log(school.listStudents().join('\n'));
console.log('\nTeachers:');
console.log(school.listTeachers().join('\n'));
school.removeStudent('12345');
console.log('\nRemaining students after removing John Doe:');
console.log(school.listStudents().join('\n'));
Система бронирования билетов на транспорт
Эта программа использует классы для представления различных видов транспорта (автобусы, поезда, самолёты), а также методы для бронирования билетов.
// Абстрактный класс Transport
class Transport {
constructor(type, capacity) {
this.type = type;
this.capacity = capacity;
this.bookedSeats = 0;
}
getType() {
return this.type;
}
getCapacity() {
return this.capacity;
}
getAvailableSeats() {
return this.capacity - this.bookedSeats;
}
bookSeat() {
if (this.bookedSeats >= this.capacity) {
throw new Error('No seats available');
}
this.bookedSeats++;
}
cancelBooking() {
if (this.bookedSeats > 0) {
this.bookedSeats--;
}
}
toString() {
return `${this.type}: Capacity ${this.capacity}, Available Seats ${this.getAvailableSeats()}`;
}
}
// Класс Bus
class Bus extends Transport {
constructor(capacity) {
super('Bus', capacity);
}
}
// Класс Train
class Train extends Transport {
constructor(capacity) {
super('Train', capacity);
}
}
// Класс Airplane
class Airplane extends Transport {
constructor(capacity) {
super('Airplane', capacity);
}
}
// Класс BookingSystem
class BookingSystem {
constructor() {
this.transports = [];
}
addTransport(transport) {
if (!(transport instanceof Transport)) {
throw new TypeError('Argument must be an instance of Transport');
}
this.transports.push(transport);
}
bookTicket(transportType) {
const transport = this.transports.find(t => t.getType() === transportType);
if (!transport) {
throw new Error(`No ${transportType} found`);
}
try {
transport.bookSeat();
console.log(`Successfully booked a seat on ${transportType}`);
} catch (error) {
console.error(error.message);
}
}
cancelBooking(transportType) {
const transport = this.transports.find(t => t.getType() === transportType);
if (!transport) {
throw new Error(`No ${transportType} found`);
}
transport.cancelBooking();
console.log(`Successfully cancelled a booking on ${transportType}`);
}
listTransports() {
return this.transports.map(transport => transport.toString());
}
}
// Использование системы бронирования билетов на транспорт
const bookingSystem = new BookingSystem();
const bus = new Bus(50);
const train = new Train(100);
const airplane = new Airplane(200);
bookingSystem.addTransport(bus);
bookingSystem.addTransport(train);
bookingSystem.addTransport(airplane);
console.log('Available transports:');
console.log(bookingSystem.listTransports().join('\n'));
bookingSystem.bookTicket('Bus');
bookingSystem.bookTicket('Train');
bookingSystem.bookTicket('Airplane');
console.log('\nUpdated availability after bookings:');
console.log(bookingSystem.listTransports().join('\n'));
bookingSystem.cancelBooking('Bus');
console.log('\nUpdated availability after cancellation:');
console.log(bookingSystem.listTransports().join('\n'));
Давайте подробно разберем каждый из приведённых выше примеров.
Разбор программы управления библиотекой книг
Структура программы
Программа состоит из трёх классов: Book
, Author
и Library
, а также демонстрационного кода, показывающего, как они работают вместе.
Класс Book
class Book {
constructor(title, author, isbn) {
this.title = title;
this.author = author;
this.isbn = isbn;
}
getTitle() {
return this.title;
}
setTitle(newTitle) {
this.title = newTitle;
}
getAuthor() {
return this.author;
}
setAuthor(newAuthor) {
this.author = newAuthor;
}
getIsbn() {
return this.isbn;
}
setIsbn(newIsbn) {
this.isbn = newIsbn;
}
toString() {
return `${this.title} by ${this.author} (ISBN: ${this.isbn})`;
}
}
Описание:
Конструктор класса Book принимает три параметра: название книги (title), автора (author) и ISBN-код (isbn).
Методы getTitle, setTitle, getAuthor, setAuthor, getIsbn и setIsbn обеспечивают доступ к свойствам объекта и их изменение.
Метод toString возвращает строковое представление книги в формате «Название книги by Автор (ISBN: ISBN-код)».
Класс Author
class Author {
constructor(name, birthYear) {
this.name = name;
this.birthYear = birthYear;
}
getName() {
return this.name;
}
setName(newName) {
this.name = newName;
}
getBirthYear() {
return this.birthYear;
}
setBirthYear(newBirthYear) {
this.birthYear = newBirthYear;
}
toString() {
return `${this.name} (${this.birthYear})`;
}
}
Описание:
Конструктор класса Author принимает два параметра: имя автора (name) и год рождения (birthYear).
Методы getName, setName, getBirthYear и setBirthYear обеспечивают доступ к свойствам объекта и их изменение.
Метод toString возвращает строковое представление автора в формате «Имя автора (Год рождения)».
Класс Library
class Library {
constructor(name) {
this.name = name;
this.books = [];
}
addBook(book) {
if (!(book instanceof Book)) {
throw new TypeError('Argument must be an instance of Book');
}
this.books.push(book);
}
removeBook(isbn) {
const index = this.books.findIndex(book => book.isbn === isbn);
if (index !== -1) {
this.books.splice(index, 1);
}
}
findBooksByAuthor(authorName) {
return this.books.filter(book => book.author === authorName);
}
listAllBooks() {
return this.books.map(book => book.toString());
}
}
Описание:
Конструктор класса Library принимает одно имя библиотеки (name) и инициализирует массив books для хранения книг.
Метод addBook добавляет книгу в библиотеку, проверяя, что аргумент является экземпляром класса Book.
Метод removeBook удаляет книгу из библиотеки по её ISBN-коду.
Метод findBooksByAuthor находит все книги заданного автора и возвращает их список.
Метод listAllBooks возвращает список всех книг в библиотеке в виде строкового представления.
Демонстрация работы
const library = new Library('Main Library');
const tolkien = new Author('J.R.R. Tolkien', 1892);
const rowling = new Author('J.K. Rowling', 1965);
const lotr = new Book('The Lord of the Rings', tolkien, '978-0618640157');
const hp1 = new Book('Harry Potter and the Philosopher\'s Stone', rowling, '978-0747532699');
library.addBook(lotr);
library.addBook(hp1);
console.log('All books:');
console.log(library.listAllBooks().join('\n'));
console.log('\nBooks by J.K. Rowling:');
console.log(library.findBooksByAuthor(rowling).map(book => book.toString()).join('\n'));
library.removeBook('978-0618640157');
console.log('\nRemaining books after removing The Lord of the Rings:');
console.log(library.listAllBooks().join('\n'));
Описание:
Создаются объекты авторов Толкиена и Роулинг.
Создаются объекты книг «Властелин колец» и «Гарри Поттер и философский камень».
Эти книги добавляются в библиотеку.
Выводятся все книги в библиотеке.
Находятся и выводятся книги авторства Джоан Роулинг.
Удаляется книга «Властелин колец» из библиотеки.
Выводятся оставшиеся книги после удаления.
Разбор программы для ведения учёта студентов и преподавателей
Структура программы
Программа состоит из двух классов: Student
и Teacher
, а также класса School
, который управляет студентами и преподавателями.
Класс Student
class Student {
constructor(firstName, lastName, studentId) {
this.firstName = firstName;
this.lastName = lastName;
this.studentId = studentId;
}
getFullName() {
return `${this.firstName} ${this.lastName}`;
}
getStudentId() {
return this.studentId;
}
toString() {
return `${this.getFullName()} (ID: ${this.studentId})`;
}
}
Описание:
Конструктор класса Student принимает три параметра: имя студента (firstName), фамилию (lastName) и идентификатор студента (studentId).
Метод getFullName возвращает полное имя студента.
Метод getStudentId возвращает идентификатор студента.
Метод toString возвращает строковое представление студента в формате «Имя Фамилия (ID: Идентификатор студента)».
Класс Teacher
class Teacher {
constructor(firstName, lastName, subject) {
this.firstName = firstName;
this.lastName = lastName;
this.subject = subject;
}
getFullName() {
return `${this.firstName} ${this.lastName}`;
}
getSubject() {
return this.subject;
}
toString() {
return `${this.getFullName()} teaches ${this.subject}.`;
}
}
Описание:
Конструктор класса Teacher принимает три параметра: имя преподавателя (firstName), фамилию (lastName) и предмет (subject).
Метод getFullName возвращает полное имя преподавателя.
Метод getSubject возвращает предмет, который преподаёт преподаватель.
Метод toString возвращает строковое представление преподавателя в формате «Имя Фамилия преподает Предмет.»
Класс School
class School {
constructor(name) {
this.name = name;
this.students = [];
this.teachers = [];
}
addStudent(student) {
if (!(student instanceof Student)) {
throw new TypeError('Argument must be an instance of Student');
}
this.students.push(student);
}
addTeacher(teacher) {
if (!(teacher instanceof Teacher)) {
throw new TypeError('Argument must be an instance of Teacher');
}
this.teachers.push(teacher);
}
removeStudent(studentId) {
const index = this.students.findIndex(student => student.studentId === studentId);
if (index !== -1) {
this.students.splice(index, 1);
}
}
removeTeacher(fullName) {
const index = this.teachers.findIndex(teacher => teacher.getFullName() === fullName);
if (index !== -1) {
this.teachers.splice(index, 1);
}
}
listStudents() {
return this.students.map(student => student.toString());
}
listTeachers() {
return this.teachers.map(teacher => teacher.toString());
}
}
Описание:
Конструктор класса School принимает одно имя школы (name) и инициализирует массивы students и teachers для хранения студентов и преподавателей соответственно.
Метод addStudent добавляет студента в школу, проверяя, что аргумент является экземпляром класса Student.
Метод addTeacher добавляет преподавателя в школу, проверяя, что аргумент является экземпляром класса Teacher.
Метод removeStudent удаляет студента из школы по его идентификатору.
Метод removeTeacher удаляет преподавателя из школы по его полному имени.
Метод listStudents возвращает список всех студентов в школе в виде строкового представления.
Метод listTeachers возвращает список всех преподавателей в школе в виде строкового представления.
Демонстрация работы
const school = new School('High School');
const john = new Student('John', 'Doe', '12345');
const jane = new Student('Jane', 'Smith', '67890');
const mathTeacher = new Teacher('Mary', 'Johnson', 'Mathematics');
const historyTeacher = new Teacher('David', 'Brown', 'History');
school.addStudent(john);
school.addStudent(jane);
school.addTeacher(mathTeacher);
school.addTeacher(historyTeacher);
console.log('Students:');
console.log(school.listStudents().join('\n'));
console.log('\nTeachers:');
console.log(school.listTeachers().join('\n'));
school.removeStudent('12345');
console.log('\nRemaining students after removing John Doe:');
console.log(school.listStudents().join('\n'));
Описание:
Создается объект школы под названием «High School».
Создаются объекты студентов Джона Доу и Джейн Смит.
Создаются объекты преподавателей Мэри Джонсон (математика) и Дэвид Браун (история).
Студенты и преподаватели добавляются в школу.
Выводятся списки студентов и преподавателей.
Ученик Джон Доу удаляется из школы.
Выводится обновленный список студентов после удаления Джона Доу.
Система бронирования билетов на транспорт
Структура программы
Программа состоит из абстрактного класса Transport
и трех конкретных классов-наследников: Bus
, Train
и Airplane
, а также класса BookingSystem
, который управляет бронированием билетов.
Абстрактный класс Transport
class Transport {
constructor(type, capacity) {
this.type = type;
this.capacity = capacity;
this.bookedSeats = 0;
}
getType() {
return this.type;
}
getCapacity() {
return this.capacity;
}
getAvailableSeats() {
return this.capacity - this.bookedSeats;
}
bookSeat() {
if (this.bookedSeats >= this.capacity) {
throw new Error('No seats available');
}
this.bookedSeats++;
}
cancelBooking() {
if (this.bookedSeats > 0) {
this.bookedSeats--;
}
}
toString() {
return `${this.type}: Capacity ${this.capacity}, Available Seats ${this.getAvailableSeats()}`;
}
}
Описание:
Конструктор класса Transport принимает два параметра: тип транспорта (type) и вместимость (capacity).
Метод getType возвращает тип транспорта.
Метод getCapacity возвращает вместимость транспорта.
Метод getAvailableSeats возвращает количество свободных мест.
Метод bookSeat бронирует одно место, если оно доступно.
Метод cancelBooking отменяет одну бронь, если места были забронированы.
Метод toString возвращает строковое представление транспорта в формате «Тип транспорта: Вместимость Вместимость, Свободных мест Количество свободных мест».
Класс Bus
class Bus extends Transport {
constructor(capacity) {
super('Bus', capacity);
}
}
Описание
Класс Bus наследуется от класса Transport.
Конструктор класса Bus принимает параметр вместимости (capacity) и передает его конструктору родителя, устанавливая тип транспорта как «Bus».
Класс Train
class Train extends Transport {
constructor(capacity) {
super('Train', capacity);
}
}
Описание:
Класс Train наследуется от класса Transport.
Конструктор класса Train принимает параметр вместимости (capacity) и передает его конструктору родителя, устанавливая тип транспорта как «Train».
Класс Airplane
class Airplane extends Transport {
constructor(capacity) {
super('Airplane', capacity);
}
}
Описание:
Класс Airplane наследуется от класса Transport.
Конструктор класса Airplane принимает параметр вместимости (capacity) и передает его конструктору родителя, устанавливая тип транспорта как "Airplane".
Класс BookingSystem
class BookingSystem {
constructor() {
this.transports = [];
}
addTransport(transport) {
if (!(transport instanceof Transport)) {
throw new TypeError('Argument must be an instance of Transport');
}
this.transports.push(transport);
}
bookTicket(transportType) {
const transport = this.transports.find(t => t.getType() === transportType);
if (!transport) {
throw new Error(`No ${transportType} found`);
}
try {
transport.bookSeat();
console.log(`Successfully booked a seat on ${transportType}`);
} catch (error) {
console.error(error.message);
}
}
cancelBooking(transportType) {
const transport = this.transports.find(t => t.getType() === transportType);
if (!transport) {
throw new Error(`No ${transportType} found`);
}
transport.cancelBooking();
console.log(`Successfully cancelled a booking on ${transportType}`);
}
listTransports() {
return this.transports.map(transport => transport.toString());
}
}
Описание:
Конструктор класса BookingSystem инициализирует массив transports для хранения объектов транспорта.
Метод addTransport добавляет транспорт в систему бронирования, проверяя, что аргумент является экземпляром класса Transport.
Метод bookTicket пытается забронировать билет на указанный тип транспорта. Если такой транспорт найден и есть свободные места, то бронируется одно место.
Метод cancelBooking отменяет бронь на указанный тип транспорта, если такой транспорт найден и есть забронированные места.
Метод listTransports возвращает список всех доступных транспортных средств в системе бронирования.
Демонстрация работы
const bookingSystem = new BookingSystem();
const bus = new Bus(50);
const train = new Train(100);
const airplane = new Airplane(200);
bookingSystem.addTransport(bus);
bookingSystem.addTransport(train);
bookingSystem.addTransport(airplane);
console.log('Available transports:');
console.log(bookingSystem.listTransports().join('\n'));
bookingSystem.bookTicket('Bus');
bookingSystem.bookTicket('Train');
bookingSystem.bookTicket('Airplane');
console.log('\nUpdated availability after bookings:');
console.log(bookingSystem.listTransports().join('\n'));
bookingSystem.cancelBooking('Bus');
console.log('\nUpdated availability after cancellation:');
console.log(bookingSystem.listTransports().join('\n'));
Описание:
Создается объект системы бронирования.
Создаются объекты автобуса, поезда и самолета с различной вместимостью.
Эти транспортные средства добавляются в систему бронирования.
Выводится список доступных транспортных средств.
Бронируются билеты на автобус, поезд и самолет.
Выводится обновленный список доступности мест после бронирования.
Отменяется бронь на автобусе.
Выводится обновленный список доступности мест после отмены бронирования.
Заключение
Спасибо, что дочитали до конца. Давайте кратко подведём итоги. В этой статье мы рассмотрели основы работы с классами в JavaScript, включая создание классов, наследование и полиморфизм. Мы также обсудили различные способы создания и работы с объектами. Понимание этих концепций поможет вам писать более чистый, организованный и масштабируемый код.