Практическая работа №6
ООП: инкапсуляция и модификаторы доступа в JavaScript
Section titled “ООП: инкапсуляция и модификаторы доступа в JavaScript”Цель работы:
- Ознакомиться с принципом инкапсуляции в ООП.
- Узнать, как в JavaScript используются приватные поля, геттеры и сеттеры для управления доступом к свойствам.
- Освоить создание и наследование классов с использованием современных возможностей языка.
Основные теоретические положения
Section titled “Основные теоретические положения”Что такое инкапсуляция?
Section titled “Что такое инкапсуляция?”Инкапсуляция — это принцип ООП, который предполагает сокрытие внутреннего состояния объекта и предоставление доступа к нему только через контролируемые методы (например, геттеры и сеттеры). Это защищает данные от некорректного изменения и упрощает поддержку кода.
Модификаторы доступа в JavaScript
Section titled “Модификаторы доступа в JavaScript”- Приватные поля: обозначаются через
#(например,#age) и доступны только внутри класса. Прямой доступ к ним из экземпляров невозможен. - Псевдоприватные свойства: по соглашению начинаются с
_(например,_age), но на самом деле доступны везде. - Геттеры и сеттеры: специальные методы для получения и установки значений с логикой проверки и контроля.
Пример класса с инкапсуляцией
Section titled “Пример класса с инкапсуляцией”class Person {// Приватное свойство _age (по соглашению) #_age;
constructor(firstName, lastName, age) { this.firstName = firstName; this.lastName = lastName; this.age = age; // вызов сеттера }
getFullName() { return ${this.firstName} ${this.lastName}; }
// Геттер для свойства age get age() { return this.#_age; }
// Сеттер с валидацией set age(newAge) { if (typeof newAge !== "number" || newAge < 0 || newAge > 120) { console.error("Ошибка: возраст должен быть числом от 0 до 120"); } else { this.#_age = newAge; } }}Основные требования к практической работе
Section titled “Основные требования к практической работе”- Использовать синтаксис классов (
class), инкапсуляцию (через приватные поля или псевдоприватные) и геттеры/сеттеры. - Построить иерархию классов с наследованием (
extends) и использованиемsuper(). - Продемонстрировать работу кода с понятными выводами в консоль.
Задания для выполнения
Section titled “Задания для выполнения”При выполнение практической работы необходимо выбрать значения из таблицы Исходные данные по номеру варианта. Если ваш номер в списке превышает количество из таблицы, то варианты повторяются по кругу (например 16-й берёт значения варианта 1 и т.д)
Исходные данные
Section titled “Исходные данные”| Вариант | name | level | health | experience | playerType | weapon | damage | armor | defense |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Артур | 5 | 80 | 1200 | Warrior | Меч | 15 | Латы | 10 |
| 2 | Лина | 7 | 60 | 1500 | Archer | Лук | 12 | Кожаная | 5 |
| 3 | Мира | 3 | 100 | 800 | Mage | Посох | 18 | Роба | 3 |
| 4 | Борис | 6 | 75 | 1100 | Warrior | Топор | 17 | Латы | 12 |
| 5 | Юля | 4 | 85 | 900 | Archer | Арбалет | 14 | Кожаная | 6 |
| 6 | Иван | 8 | 50 | 1600 | Mage | Магический посох | 20 | Роба | 4 |
| 7 | Светлана | 5 | 70 | 1250 | Warrior | Двуручный меч | 18 | Латы | 11 |
| 8 | Олег | 6 | 65 | 1400 | Archer | Лук | 13 | Кожаная | 7 |
| 9 | Катя | 7 | 60 | 1550 | Mage | Посох | 19 | Роба | 5 |
| 10 | Николай | 9 | 55 | 1750 | Warrior | Меч | 22 | Латы | 13 |
| 11 | Елена | 4 | 80 | 950 | Archer | Арбалет | 15 | Кожаная | 6 |
| 12 | Дмитрий | 7 | 68 | 1450 | Mage | Магический посох | 21 | Роба | 4 |
| 13 | Анна | 5 | 73 | 1300 | Warrior | Топор | 16 | Латы | 10 |
| 14 | Павел | 6 | 60 | 1350 | Archer | Лук | 14 | Кожаная | 7 |
| 15 | Марина | 8 | 58 | 1650 | Mage | Посох | 20 | Роба | 5 |
Задание 1. Класс Character
Section titled “Задание 1. Класс Character”- Создайте класс
Characterдля базового персонажа. - В конструкторе инициализируйте публичное свойство
nameи приватные свойства#level,#health,#experience. - Реализуйте геттеры для всех приватных свойств, чтобы можно было безопасно получать их значения.
- Реализуйте сеттеры с проверкой:
level— целое число >= 1,health— число от 0 до 100,experience— число >= 0.
- Метод
gainExperience(amount)добавляет указанное количество опыта. - Метод
levelUp()повышает уровень на 1 и восстанавливает здоровье до 100. - Метод
status()возвращает строку с информацией о персонаже (имя, уровень, здоровье, опыт).
Задание 2. Класс Player
Section titled “Задание 2. Класс Player”- Наследуйте класс
PlayerотCharacter. - Добавьте публичное свойство
playerType(например, Воин, Лучник, Маг). - Приватные свойства:
#weapon(название оружия),#damage(урон),#armor(название брони),#defense(защита). - Сделайте геттеры и сеттеры с проверками для приватных свойств.
- Переопределите метод
status(), добавив детали оружия и брони. - Метод
attack()возвращает строку, описывающую атаку, например: «Артур атакует Мечом, нанося 15 урона». - Метод
defend(damage), который уменьшает здоровье с учётом защиты (урон минус защита, минимум 0).
Задание 3. Класс Enemy
Section titled “Задание 3. Класс Enemy”- Создайте класс
Enemyс дополнительным приватным свойством#type(например, «Огр», «Скелет»). - Геттер для
type. - Метод
attack()возвращает строку с типом врага и наносимым уроном. - Метод
takeDamage(damage)уменьшает здоровье до не менее 0.
Задание 4. Симуляция боя
Section titled “Задание 4. Симуляция боя”- Создайте массив из нескольких врагов
Enemyс любыми параметрами. - Организуйте цикл, в котором
Playerпо очереди сражается с каждым врагом:- Игрок атакует врага (вызов
takeDamage). - Если враг жив, он атакует игрока (
defend). - Проверяйте здоровье после каждой атаки. Если здоровье <= 0, объявить поражение или победу и выйти из цикла по этому противнику.
- Игрок атакует врага (вызов
- После победы игрока над врагом вызовите
gainExperience. - В конце выведите полное состояние игрока.
Контрольные вопросы
Section titled “Контрольные вопросы”- Что такое инкапсуляция и как она реализуется через приватные свойства в JavaScript?
- Для чего нужны геттеры и сеттеры с валидацией?
- Чем полезно наследование и вызов
super()? - Как циклы помогают моделировать игровые процессы?
- Почему важно контролировать состояние объектов через методы?
Рекомендуемая литература
Section titled “Рекомендуемая литература”- Классы в JavaScript (learn.javascript.ru)
- Геттеры и сеттеры
- Private class fields - MDN
- extends и super() - MDN