Условие
В гавани ProtoBay радиоузлы наследуют общее поведение через прототипы. Допишите nodeBase: absorbHit(load) считает spent = Math.max(1, load * (1 - this.shield / 100)), уменьшает this.power (не ниже 0) и возвращает spent; getStatus() возвращает строку вида «power N · shield M». Создайте dockNode и relayNode через Object.create(nodeBase). У дока: power 100, shield 70, band «VHF-12», метод ping(name). У ретранслятора: power 80, shield 25, метод restore(target) (+20 к power, потолок 200). В #out выведите сценарий как во вкладке «Результат»: статус дока → удар 40 → статус ретранслятора → restore дока → Object.setPrototypeOf(dockNode, relayNode) → проверки hasOwnProperty / Object.getPrototypeOf → dockNode.restore(relayNode). Устаревший __proto__ не используйте.
Что нужно сделать
- Допишите методы
absorbHitиgetStatusуnodeBase. - Создайте
dockNodeиrelayNodeчерезObject.create. - Соберите вывод в
#out, смените прототип и проверьтеhasOwnProperty.
Подсказка для новичка
Каркас nodeBase уже в стартере. Наследников создавайте так: const dockNode = Object.create(nodeBase); - затем переопределяйте свойства. Для строки hit используйте spent.toFixed(1). После setPrototypeOf метод restore у дока не свой - hasOwnProperty("restore") даст false, но вызвать его можно.
Стартовый код
Допишите решение в редакторе слева, сверьте с вкладкой «Результат» и нажмите Проверить. Кнопка «Помощник» подставит решение по шагам.
Вот так должно получиться
В блоке #out статус узлов, удар, boost и проверки hasOwn / прототипа:
Как пользоваться IDE
- Предпросмотр — как выглядит ваша страница.
- Результат — какой итог должен получиться.
- Описание задачи — полное условие и справка.
- Задание — краткие шаги 1–2–3 снизу.
- Помощник — подсказки по шагам.
- Черновик — ссылка на ваш код.
- Сброс кода — стартовый шаблон.
Зачем нужны прототипы
В JavaScript объект - самостоятельная сущность программы: у него есть данные (свойства) и действия (методы). Общий шаблон поведения выносят в прототип, а конкретные экземпляры берут методы по цепочке, не копируя код. Так устроены и встроенные типы: у массива свои методы в Array.prototype, а дальше цепочка ведёт к Object.prototype.
Примитив и временная обёртка
Строка в кавычках - примитив (typeof даст "string"). Когда вы вызываете метод вроде toUpperCase(), движок на мгновение оборачивает значение в объект-обёртку, выполняет метод и снова возвращает примитив. Явно писать new String(...) в обычном коде не нужно.
Современный API вместо __proto__
Object.create(proto)- создать объект сразу с нужным прототипом.Object.setPrototypeOf(obj, proto)- сменить прототип у уже существующего объекта (редко, но полезно понять механизм).Object.getPrototypeOf(obj)- узнать текущий прототип.obj.hasOwnProperty("key")- свойство лежит на самом объекте или пришло по цепочке.__proto__- устаревший способ; в этой задаче запрещён.
Сценарий ProtoBay
nodeBase- общий прототип: power, shield, absorbHit, getStatus.dockNode- причал: свои power/shield/band и метод ping.relayNode- ретранслятор: метод restore(+20, max 200).- Удар
absorbHit(40)при shield 70 → spent 12, power 88. - После setPrototypeOf док временно «умеет» restore, но hasOwnProperty("restore") === false.
Разметка и стили превью
<pre id="out">- сюда пишете итоговый текст.bodyфон #fffbeb, заголовок #92400e, рамка #out - #fcd34d.- Решайте только в
script.js.
Коротко: nodeBase → Object.create → сценарий → setPrototypeOf → hasOwn → #out.