Практическая работа №8
Основные теоретические положения
Section titled “Основные теоретические положения”1. Объявление класса
class User { constructor(name, age) { this.name = name; this.age = age; }
showInfo() { console.log( `${this.name}, ${this.age}` ); }}Создание экземпляра:
const user = new User("Иван", 20);
user.showInfo();2. Конструктор
Метод constructor() выполняется при создании экземпляра.
class Product { constructor(id, name, price) { this.id = id; this.name = name; this.price = price; }}Каждый экземпляр получает собственные значения свойств.
3. Методы класса
class Product { constructor(name, price) { this.name = name; this.price = price; }
changePrice(newPrice) { if (newPrice > 0) { this.price = newPrice; } }
showInfo() { console.log( `${this.name}: ${this.price} руб.` ); }}Методы, объявленные в классе, фактически находятся в прототипе класса.
Проверка:
console.log( Object.getPrototypeOf( new Product("Мышь", 1500) ) === Product.prototype);4. Наследование через extends
class User { constructor(name) { this.name = name; }
showInfo() { console.log(this.name); }}
class Admin extends User {}Экземпляр Admin получает доступ к методам User.
5. Вызов базового конструктора через super()
class Admin extends User { constructor(name, permissions) { super(name);
this.permissions = permissions; }}В производном классе super() должен быть вызван до обращения к this.
6. Переопределение метода
class Admin extends User { showInfo() { console.log( `Администратор: ${this.name}` ); }}Метод производного класса заменяет поведение, унаследованное от базового.
7. Вызов метода базового класса
class Admin extends User { showInfo() { super.showInfo();
console.log("Расширенные права"); }}super.method() позволяет использовать реализацию родительского класса.
8. Несколько экземпляров и массив объектов
const users = [ new User("Иван"), new Admin("Анна", ["users", "settings"]),];Все экземпляры можно обрабатывать в одном цикле:
for (const user of users) { user.showInfo();}При этом будет вызван метод, соответствующий фактическому типу объекта.
9. Классы всё равно используют прототипы
const admin = new Admin("Анна", []);
console.log( Object.getPrototypeOf(admin) === Admin.prototype);
console.log( Object.getPrototypeOf(Admin.prototype) === User.prototype);Синтаксис class делает описание объектной модели удобнее, но механизм наследования остаётся прототипным.
10. Наследование и композиция
Не каждое отношение между сущностями означает наследование.
Например:
Admin является Userможет быть наследованием.
Но:
Order содержит Customerлучше описывать как композицию:
class Order { constructor(id, customer) { this.id = id; this.customer = customer; }}Объект customer является частью объекта заказа, но заказ не является разновидностью клиента.
Задания для выполнения
Section titled “Задания для выполнения”Часть 1. Исследование классов
Выполните задания 1–4 полностью.
Задание 1.1. Класс и экземпляры
Создайте класс:
class Product { constructor(id, name, price) { // ... }
showInfo() { // ... }
changePrice(newPrice) { // ... }}Создайте три экземпляра.
Проверьте изменение цены и выведите все объекты.
Задание 1.2. Проверка прототипной природы класса
Для одного экземпляра выполните:
Object.getPrototypeOf(product)Object.getPrototypeOf(product) === Product.prototypeObject.hasOwn(product, "name")Object.hasOwn(product, "showInfo")Объясните полученные результаты.
Задание 1.3. Наследование
Создайте:
class DigitalProduct extends Product { constructor( id, name, price, fileSize ) { // ... }
showInfo() { // ... }}Используйте super().
Переопределите showInfo() и внутри него вызовите:
super.showInfo();Задание 1.4. Единый массив экземпляров
Создайте массив:
const products = [ new Product(...), new DigitalProduct(...), new Product(...),];В цикле вызовите для каждого:
product.showInfo();Объясните, почему для разных объектов выполняется разная реализация метода.
Часть 2. Комплексное индивидуальное задание
Section titled “Часть 2. Комплексное индивидуальное задание”Вариант 1. Пользователи информационной системы
Классы:
UserAdminUser:
idnameactiveМетоды:
showInfo()activate()deactivate()Admin:
permissionsДополнительные методы:
addPermission()showPermissions()Переопределите showInfo().
Программа должна позволять создавать пользователей, искать по id, изменять активность и выводить список администраторов.
Вариант 2. Система сетевых устройств
Классы:
DeviceRouterDevice:
idnameonlineМетоды:
showInfo()turnOn()turnOff()Router:
ipconnectedDevicesДобавьте:
connectDevice()Переопределите showInfo().
Вариант 3. Система транспорта
Классы:
VehicleCarVehicle:
idbrandspeedМетоды:
showInfo()accelerate()stop()Car:
fuelДобавьте:
refuel()Переопределите accelerate() так, чтобы движение было невозможно при отсутствии топлива.
Вариант 4. RPG-система
Классы:
CharacterWarriorCharacter:
namehealthlevelМетоды:
showInfo()takeDamage()heal()Warrior:
armorПереопределите takeDamage().
Добавьте взаимодействие с массивом персонажей и возможность выбрать цель через prompt().
Вариант 5. Каталог товаров
Классы:
ProductDigitalProductProduct:
idnamepriceМетоды:
showInfo()changePrice()DigitalProduct:
fileSizedownloadLinkДобавьте:
getDownloadInfo()Переопределите showInfo().
Вариант 6. Система технической поддержки
Классы:
TicketIncidentTicket:
idtitlestatusМетоды:
showInfo()changeStatus()Incident:
priorityДобавьте:
isCritical()Переопределите showInfo().
Реализуйте поиск заявки и изменение статуса через меню.
Вариант 7. Банковская система
Классы:
AccountPremiumAccountAccount:
idownerbalanceМетоды:
showInfo()deposit()withdraw()PremiumAccount:
cashbackPercentДобавьте:
calculateCashback()Переопределите withdraw() или showInfo().
Не допускайте отрицательный баланс.
Вариант 8. Учёт сотрудников
Классы:
EmployeeManagerEmployee:
idnamesalaryМетоды:
showInfo()changeSalary()Manager:
departmentbonusДобавьте:
calculateIncome()Переопределите showInfo().
Вариант 9. Файловая система
Классы:
FileItemVideoFileFileItem:
idnamesizeМетоды:
showInfo()rename()VideoFile:
durationresolutionДобавьте:
getVideoInfo()Переопределите showInfo().
Вариант 10. Система бронирования
Классы:
BookingVipBookingBooking:
idguestpriceМетоды:
showInfo()changePrice()VipBooking:
discountserviceДобавьте:
calculateFinalPrice()Переопределите showInfo() и используйте super.showInfo().
Требования к результату
Section titled “Требования к результату”Программа должна:
- использовать современный синтаксис
class; - содержать базовый и производный классы;
- использовать
extendsиsuper; - содержать переопределение метода;
- использовать массив экземпляров;
- выполнять поиск и изменение данных;
- содержать интерактивное меню;
- проверять ошибочный ввод;
- демонстрировать различие между собственными свойствами экземпляра и методами его прототипа;
- не создавать бессмысленные иерархии только ради использования наследования.
Контрольные вопросы
Section titled “Контрольные вопросы”- Для чего используется
class? - Что выполняет
constructor()? - Где фактически располагаются методы класса?
- Как создаётся экземпляр класса?
- Что делает
extends? - Для чего используется
super()? - Почему в производном конструкторе
super()вызывается до обращения кthis? - Как вызвать метод базового класса?
- Что называется переопределением метода?
- Что произойдёт при вызове переопределённого метода у производного объекта?
- Можно ли хранить экземпляры разных связанных классов в одном массиве?
- Почему вызов одного и того же метода может приводить к разному поведению?
- Используют ли классы JavaScript прототипы?
- Как проверить прототип экземпляра класса?
- Как связаны
Child.prototypeиParent.prototype? - Чем классовый синтаксис отличается от функции-конструктора?
- Чем наследование отличается от композиции?
- В каких случаях отношение между сущностями не следует реализовывать через
extends? - Почему объектная модель должна отражать смысл предметной области?
- Как №7 и №8 связаны между собой?