- Активируйте строгий режим соответствия.
- Скопируйте код к себе в редактор:
const items = [
{
title: 'Телепорт бытовой VZHIH-101',
available: 7,
holded: 0
},
{
title: 'Ховерборд Mattel 2016',
available: 4,
holded: 5
},
{
title: 'Меч световой FORCE (синий луч)',
available: 1,
holded: 1
}
];Перед началом работы добавьте этот код в редактор:
const itemPrototype = {
sell(field, amount = 1) {
if (this[field] < amount) {
throw `Недостаточно товара для продажи (${this[field]} из ${amount})`
}
this[field] -= amount;
return true;
},
sellHolded(amount = 1) {
return itemPrototype.sell.call(this, 'holded', amount);
},
sellAvailable(amount = 1) {
return itemPrototype.sell.call(this, 'available', amount);
}
};Нам нужно обновлять остатки товаров на складе при продаже товара. У нас уже есть функционал для этого в объекте itemPrototype. Но, как говорит наш ведущий разработчик, мы не можем вносить изменения в объекты из массива items, поэтому требуется найти другое решение, которое не затронет товары, и при этом задействует уже существующий функционал.
Функция sellItem должна принимать товар из массива items или аналогичный и обновлять его остатки и резерв, используя функции itemPrototype.sellAvailable, если продажа осуществляется из остатка или itemPrototype.sellHolded, если продажа осуществляется из резерва. Функция сама не должна никак изменять объект товара. Принимает следующие аргументы:
item— товар, объект;amount— количество товара, которое требуется зарезервировать, целое число;isHolded— нужно ли списывать из резерва, по умолчаниюfalse, логический тип.
sellItem(items[2], 1);
console.log(items[2].available); // 0
console.log(items[2].holded); // 1
sellItem(items[1], 4, true);
console.log(items[1].available); // 4
console.log(items[1].holded); // 1
const item = { available: 0, holded: 1 };
sellItem(item, 1, true);
console.log(item.available); // 0
console.log(item.holded); // 0Убедитесь, что все примеры в вашей реализации дают именно такой результат. И попробуйте свои варианты использования.
- Создайте функцию
sellItem. - Проверьте аргумент
isHolded: если он равенtrue, воспользуйтесь функциейitemPrototype.sellHolded, иначе —itemPrototype.sellAvailable. - Вызовите выбранную функцию в контексте объекта, переданного в
item, передав в неё количество из аргументаamount.
Перед началом работы добавьте код в редактор:
function formatFull() {
return `${this.title}:\n\tдоступно ${this.available} шт.\n\tв резерве ${this.holded} шт.`;
}
function formatLite() {
return `${this.title} (${this.available} + ${this.holded})`;
}
function show(format) {
console.log(format());
}В разных разделах системы нам нужно выводить список товаров в разном виде. Поэтому нужна функция, которая бы выводила каждый товар, используя функцию show, отформатировав товар заданной функцией, например, formatFull или formatLite.
Реализовать функцию showItems, которая будет принимать список товаров, аналогичный массиву items, и выводить каждый элемент списка, используя функцию show и переданную функцию форматирования товара. Принимает следующие аргументы:
list— список товаров, массив;formatter— функция форматирования, функция. Функция не должна менять объекты в массивеlistи сама что-либо выводить в консоль. Обратите внимание на то, что функцияshowпринимает функцию, которая должна вернуть строку.
showItems(items, formatFull);
console.log('---');
showItems(items, formatLite);Если функция showItems реализована верно, то вывод будет таким:
Телепорт бытовой VZHIH-101:
доступно 7 шт.
в резерве 0 шт.
Ховерборд Mattel 2016:
доступно 4 шт.
в резерве 1 шт.
Меч световой FORCE (синий луч):
доступно 0 шт.
в резерве 1 шт.
---
Телепорт бытовой VZHIH-101 (7 + 0)
Ховерборд Mattel 2016 (4 + 1)
Меч световой FORCE (синий луч) (0 + 1)
- Создайте функцию
showItems. - Пролистайте список из аргумента
listоптимальным способом. - Для каждого элемента списка вызовите функцию
show, передав в неё функцию, которая отформатирует товар, используя функцию из аргументаformatter.
Проверьте работу функции по примерам использования. А также попробуйте с её помощью вывести свой список товаров и свою функцию форматирования товара.
Перед началом работы скопируйте код в редактор:
function createButton(title, onclick) {
return {
title,
onclick,
click() {
this.onclick.call(this);
}
};
}Создайте функцию createBuyButtons, которая будет принимать список товаров, и для каждого товара из списка создаст кнопку с заголовком Купить, используя функцию createButton. При «клике» на кнопку для товара с названием Телепорт бытовой VZHIH-101 в консоль должно выводиться Телепорт бытовой VZHIH-101 добавлен в корзину. Функция принимает следующий аргумент:
items— список товаров, аналогичныйitems, массив.
Функция должна вернуть массив кнопок, созданных функцией createButton. Функция createButton принимает название кнопки и функцию, которая вызывается при «клике» на кнопку. Клик на кнопке симулируется вызовом метода click у созданной кнопки.
const buttons = createBuyButtons(items);
buttons[0].click();
buttons[2].click();
buttons[1].click();Если функция createBuyButtons реализована верно, то вы получите такой вывод в консоль:
Телепорт бытовой VZHIH-101 добавлен в корзину
Меч световой FORCE (синий луч) добавлен в корзину
Ховерборд Mattel 2016 добавлен в корзину
- Создайте функцию
createBuyButtons. - Пролистайте список из аргумента
itemsоптимальным способом. - Для каждого элемента списка вызовите функцию
createButton, передав первым аргументом строку Купить, а вторым – функцию, которая выведет при вызове название товара в консоль.
Убедитесь, что пример использования функции работает как описано выше.
Инструкция по выполнению домашнего задания:
- Зарегистрируйтесь на сайте Repl.IT.
- Перейдите в раздел my repls.
- Нажмите кнопку Start coding now!, если приступаете впервые, или New Repl, если у вас уже есть работы.
- В списке языков выберите JavaScript.
- Код пишите в левой части окна.
- Посмотреть результат выполнения файла можно, нажав на кнопку Run. Результат появится в правой части окна.
- После окончания работы нажмите кнопку Share и скопируйте ссылку из поля Share link.
- В личном кабинете на сайте netology.ru в поле комментария к домашней работе вставьте скопированную ссылку и отправьте работу на проверку.
Никаких файлов прикреплять не нужно.