Skip to content

Практическая работа №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 “Основные требования к практической работе”
  1. Использовать синтаксис классов (class), инкапсуляцию (через приватные поля или псевдоприватные) и геттеры/сеттеры.
  2. Построить иерархию классов с наследованием (extends) и использованием super().
  3. Продемонстрировать работу кода с понятными выводами в консоль.

Задания для выполнения

Section titled “Задания для выполнения”

При выполнение практической работы необходимо выбрать значения из таблицы Исходные данные по номеру варианта. Если ваш номер в списке превышает количество из таблицы, то варианты повторяются по кругу (например 16-й берёт значения варианта 1 и т.д)

ВариантnamelevelhealthexperienceplayerTypeweapondamagearmordefense
1Артур5801200WarriorМеч15Латы10
2Лина7601500ArcherЛук12Кожаная5
3Мира3100800MageПосох18Роба3
4Борис6751100WarriorТопор17Латы12
5Юля485900ArcherАрбалет14Кожаная6
6Иван8501600MageМагический посох20Роба4
7Светлана5701250WarriorДвуручный меч18Латы11
8Олег6651400ArcherЛук13Кожаная7
9Катя7601550MageПосох19Роба5
10Николай9551750WarriorМеч22Латы13
11Елена480950ArcherАрбалет15Кожаная6
12Дмитрий7681450MageМагический посох21Роба4
13Анна5731300WarriorТопор16Латы10
14Павел6601350ArcherЛук14Кожаная7
15Марина8581650MageПосох20Роба5

  • Создайте класс Character для базового персонажа.
  • В конструкторе инициализируйте публичное свойство name и приватные свойства #level, #health, #experience.
  • Реализуйте геттеры для всех приватных свойств, чтобы можно было безопасно получать их значения.
  • Реализуйте сеттеры с проверкой:
    • level — целое число >= 1,
    • health — число от 0 до 100,
    • experience — число >= 0.
  • Метод gainExperience(amount) добавляет указанное количество опыта.
  • Метод levelUp() повышает уровень на 1 и восстанавливает здоровье до 100.
  • Метод status() возвращает строку с информацией о персонаже (имя, уровень, здоровье, опыт).
  • Наследуйте класс Player от Character.
  • Добавьте публичное свойство playerType (например, Воин, Лучник, Маг).
  • Приватные свойства: #weapon (название оружия), #damage (урон), #armor (название брони), #defense (защита).
  • Сделайте геттеры и сеттеры с проверками для приватных свойств.
  • Переопределите метод status(), добавив детали оружия и брони.
  • Метод attack() возвращает строку, описывающую атаку, например: «Артур атакует Мечом, нанося 15 урона».
  • Метод defend(damage), который уменьшает здоровье с учётом защиты (урон минус защита, минимум 0).
  • Создайте класс Enemy с дополнительным приватным свойством #type (например, «Огр», «Скелет»).
  • Геттер для type.
  • Метод attack() возвращает строку с типом врага и наносимым уроном.
  • Метод takeDamage(damage) уменьшает здоровье до не менее 0.

Задание 4. Симуляция боя

Section titled “Задание 4. Симуляция боя”
  • Создайте массив из нескольких врагов Enemy с любыми параметрами.
  • Организуйте цикл, в котором Player по очереди сражается с каждым врагом:
    • Игрок атакует врага (вызов takeDamage).
    • Если враг жив, он атакует игрока (defend).
    • Проверяйте здоровье после каждой атаки. Если здоровье <= 0, объявить поражение или победу и выйти из цикла по этому противнику.
  • После победы игрока над врагом вызовите gainExperience.
  • В конце выведите полное состояние игрока.

  1. Что такое инкапсуляция и как она реализуется через приватные свойства в JavaScript?
  2. Для чего нужны геттеры и сеттеры с валидацией?
  3. Чем полезно наследование и вызов super()?
  4. Как циклы помогают моделировать игровые процессы?
  5. Почему важно контролировать состояние объектов через методы?

Рекомендуемая литература

Section titled “Рекомендуемая литература”
  1. Классы в JavaScript (learn.javascript.ru)
  2. Геттеры и сеттеры
  3. Private class fields - MDN
  4. extends и super() - MDN