Практическая работа №5
Объекты, Классы и Наследование в JavaScript
Section titled “Объекты, Классы и Наследование в JavaScript”Цель работы:
- Закрепить теоретические знания об Объектно-Ориентированном Программировании (ООП) в контексте JavaScript.
- Научиться использовать современный синтаксис классов (
class) для создания объектов. - Освоить механизм наследования (
extends) и вызова родительского конструктора (super()). - Научиться применять геттеры и сеттеры для контроля доступа к свойствам объектов.
Основные теоретические положения
Section titled “Основные теоретические положения”1. Что такое ООП?
Section titled “1. Что такое ООП?”Объектно-Ориентированное Программирование (ООП) — это методология программирования, основанная на концепции объектов, которые могут содержать данные (свойства) и код для работы с этими данными (методы). Основные принципы ООП включают:
| Принцип | Описание |
|---|---|
| Инкапсуляция | Сокрытие внутренней реализации объекта и ограничение прямого доступа к его данным. Доступ осуществляется через публичные методы (включая геттеры и сеттеры). |
| Наследование | Возможность создавать новый класс (дочерний) на основе существующего (родительского), перенимая его свойства и методы. |
| Полиморфизм | Возможность использовать один и тот же интерфейс для различных типов данных. Например, метод с одним именем может вести себя по-разному в разных классах. |
2. Классы в JavaScript
Section titled “2. Классы в JavaScript”В JavaScript классы являются, по сути, “синтаксическим сахаром” над существующим прототипным наследованием, но они предоставляют более чистый и привычный для многих разработчиков способ создания объектов.
Синтаксис класса
Section titled “Синтаксис класса”Класс объявляется с помощью ключевого слова class.
class Animal { // Конструктор — специальный метод для создания и инициализации объекта constructor(name, species) { this.name = name; this.species = species; }
// Метод класса makeSound(sound) { console.log(`${this.name} (${this.species}) издает звук: ${sound}`); }}
// Создание экземпляра класса (объекта)const dog = new Animal("Бобик", "Собака");dog.makeSound("Гав-гав"); // Вывод: Бобик (Собака) издает звук: Гав-гав3. Наследование и ключевое слово super()
Section titled “3. Наследование и ключевое слово super()”Наследование позволяет создать новый класс, который является специализированной версией другого класса. Для этого используется ключевое слово extends.
Ключевое слово extends
Section titled “Ключевое слово extends”Класс Dog наследует все свойства и методы класса Animal.
class Dog extends Animal { constructor(name, breed) { // 1. Вызов конструктора родительского класса // Это ОБЯЗАТЕЛЬНОЕ условие в дочернем классе super(name, "Собака");
// 2. Инициализация собственных свойств this.breed = breed; }
// Переопределение метода родительского класса (Полиморфизм) makeSound() { // Вызов метода родительского класса super.makeSound("Гав-гав"); }
// Собственный метод fetch() { console.log(`${this.name} приносит палку.`); }}
const rex = new Dog("Рекс", "Немецкая овчарка");rex.makeSound(); // Вывод: Рекс (Собака) издает звук: Гав-гавrex.fetch(); // Вывод: Рекс приносит палку.Ключевое слово super()
Section titled “Ключевое слово super()”Ключевое слово super используется в двух случаях:
- В конструкторе дочернего класса:
super(...)вызывает конструктор родительского класса. Важно:super()должен быть вызван до использованияthisв конструкторе дочернего класса. - В методах дочернего класса:
super.methodName(...)вызывает метод с тем же именем из родительского класса.
4. Геттеры и Сеттеры
Section titled “4. Геттеры и Сеттеры”Геттеры (Getters) и Сеттеры (Setters) — это специальные методы, которые позволяют контролировать доступ к свойствам объекта. Они выглядят как обычные свойства, но при чтении или записи значения фактически вызывается функция.
| Метод | Ключевое слово | Назначение |
|---|---|---|
| Геттер | get | Вызывается при попытке получить значение свойства. Используется для вычисления значения или для возврата приватного свойства. |
| Сеттер | set | Вызывается при попытке установить значение свойства. Используется для валидации данных перед их сохранением. |
class Product { constructor(name, price) { this.name = name; // Приватное свойство (по соглашению) this._price = price; }
// Геттер для получения цены get price() { return this._price; }
// Сеттер для установки цены с валидацией set price(newPrice) { if (newPrice < 0) { console.error("Цена не может быть отрицательной."); return; } this._price = newPrice; }}
const laptop = new Product("Ноутбук", 1200);
// Вызов геттераconsole.log(laptop.price); // 1200
// Вызов сеттераlaptop.price = 1500;console.log(laptop.price); // 1500
// Попытка установить невалидное значениеlaptop.price = -100; // Вывод: Цена не может быть отрицательной.console.log(laptop.price); // 1500 (значение не изменилось)Общие требования
Section titled “Общие требования”Для каждого задания необходимо:
- Написать программу на языке программирования JavaScript (в одном файле, например,
oop_practice.js). - Произвести отладку программы и продемонстрировать работу всех требуемых функций, выводя результаты в консоль.
- Обязательно использовать синтаксис
class,extends,super(),getиset.
Задания для выполнения
Section titled “Задания для выполнения”Задание 1. Базовый класс и Геттеры/Сеттеры (Инкапсуляция)
Section titled “Задание 1. Базовый класс и Геттеры/Сеттеры (Инкапсуляция)”Создайте класс Person (Человек), который будет служить базовой моделью.
-
Класс
Person:- Создайте класс
Personс конструктором, который принимает и инициализирует свойстваfirstName,lastNameиage. - Добавьте метод
getFullName(), который возвращает полное имя человека. - Добавьте геттер
ageдля получения значения свойства_age(используйте префикс_для свойства, чтобы показать, что оно должно быть “приватным” по соглашению). - Добавьте сеттер
age, который выполняет следующую валидацию:- Если переданное значение
newAgeменьше 0 или больше 120, выведите в консоль сообщение об ошибке и не изменяйте свойство. - В противном случае, установите значение свойства
_age.
- Если переданное значение
- Создайте класс
-
Тестирование
Person:- Создайте два экземпляра класса
Person. - Выведите в консоль полное имя каждого человека, используя метод
getFullName(). - Проверьте работу геттера, выведя в консоль возраст одного из объектов через синтаксис свойства (например,
person1.age). - Проверьте работу сеттера, установив корректный возраст (например,
person1.age = 30). - Проверьте работу валидации сеттера, попытавшись установить некорректный возраст (например,
person1.age = 150).
- Создайте два экземпляра класса
Задание 2. Наследование и ключевое слово super()
Section titled “Задание 2. Наследование и ключевое слово super()”Создайте класс Employee (Сотрудник), который наследует функциональность от класса Person.
-
Класс
Employee:- Создайте класс
Employee, который наследуется от классаPersonс помощью ключевого словаextends. - Конструктор класса
Employeeдолжен приниматьfirstName,lastName,age, а также новые свойстваposition(должность) иsalary(зарплата). - Внутри конструктора
Employeeобязательно вызовите конструктор родительского классаPersonс помощьюsuper(firstName, lastName, age). - Инициализируйте собственные свойства
positionиsalary. - Добавьте метод
getAnnualSalary(), который возвращает годовую зарплату (12 *salary). - Переопределите метод
getFullName()из родительского класса, чтобы он возвращал полное имя вместе с должностью, например:"Иван Петров (Менеджер)".
- Создайте класс
-
Тестирование
Employee:- Создайте два экземпляра класса
Employee. - Выведите в консоль полное имя и должность одного из сотрудников, используя переопределенный метод
getFullName(). - Выведите в консоль годовую зарплату второго сотрудника.
- Проверьте, что вы все еще можете использовать геттер/сеттер
ageиз родительского классаPersonдля объектовEmployee.
- Создайте два экземпляра класса
Задание 3. Иерархия классов с дополнительными Геттерами/Сеттерами
Section titled “Задание 3. Иерархия классов с дополнительными Геттерами/Сеттерами”Создайте класс Manager, который наследуется от Employee, и добавьте в него дополнительную логику инкапсуляции.
-
Класс
Manager:- Создайте класс
Manager, который наследуется от классаEmployee. - Конструктор
Managerдолжен принимать все свойстваEmployee, а также новое свойствоteamSize(количество человек в команде). - Обязательно используйте
super(...)для передачи всех родительских свойств. - Добавьте геттер
teamSizeдля получения значения свойства_teamSize. - Добавьте сеттер
teamSize, который выполняет следующую валидацию:- Если переданное значение
newSizeне является положительным числом (меньше или равно 0), выведите в консоль сообщение об ошибке и не изменяйте свойство. - В противном случае, установите значение свойства
_teamSize.
- Если переданное значение
- Создайте класс
-
Тестирование
Manager:- Создайте один экземпляр класса
Manager. - Выведите в консоль его полное имя (включая должность) и годовую зарплату.
- Проверьте работу сеттера
teamSize, установив корректное значение (например,manager1.teamSize = 5). - Проверьте работу валидации, попытавшись установить некорректное значение (например,
manager1.teamSize = 0). - Продемонстрируйте, что объект
Managerимеет доступ к всем методам и свойствам своих родительских классов (PersonиEmployee).
- Создайте один экземпляр класса
Контрольные вопросы
Section titled “Контрольные вопросы”- Объясните, в чем заключается принцип инкапсуляции в ООП и как он реализуется в JavaScript с помощью геттеров и сеттеров.
- Какова основная функция ключевого слова
extendsпри работе с классами в JavaScript? - Почему в конструкторе дочернего класса обязательно нужно вызывать
super()до использования ключевого словаthis? - Приведите пример, когда использование сеттера является более предпочтительным, чем прямое изменение свойства объекта.
- В чем разница между вызовом
super()в конструкторе и вызовомsuper.methodName()в методе дочернего класса?
Рекомендуемая литература
Section titled “Рекомендуемая литература”- Классы в JavaScript - Современный учебник JavaScript.
- Наследование классов - Современный учебник JavaScript.
- Геттеры и Сеттеры - Современный учебник JavaScript.
- Class - MDN Web Docs - Официальная документация Mozilla Developer Network.
- extends - MDN Web Docs - Официальная документация Mozilla Developer Network.