|
| 1 | +'use strict'; |
| 2 | + |
| 3 | +// Задание 1: |
| 4 | +// Как, используя call или apply, можно "одолжить" метод forEach у настоящего массива и заставить его работать с псевдомассивом arguments? |
| 5 | + |
| 6 | +function showAll() { |
| 7 | + // Array.prototype.forEach.call(arguments, (arg) => { |
| 8 | + // console.log(arg); |
| 9 | + // }); |
| 10 | + // ?? или так, просто.. литеральная запись [] и далее одолжаем метод forEach() и вызываем для arguments |
| 11 | + [].forEach.call(arguments, (arg) => { |
| 12 | + console.log(arg); |
| 13 | + }); |
| 14 | +} |
| 15 | + |
| 16 | +showAll('Привет', 'мир', '!'); // Привет мир ! |
| 17 | + |
| 18 | +// Задание 2: |
| 19 | +// У вас есть объект logger, который должен добавлять префикс ко всем сообщениям. А также есть сторонняя, очень простая функция print, которая просто выводит в консоль всё, что ей передали. |
| 20 | +// Ваша задача: Реализовать метод logger.log, не меняя функцию print. Внутри logger.log вы должны использовать (вызвать) функцию print таким образом, чтобы она вывела сначала префикс из logger, а затем все остальные аргументы. |
| 21 | +// Как вы решите эту задачу с помощью call или apply? |
| 22 | + |
| 23 | +function print(...args) { |
| 24 | + console.log(...args); |
| 25 | +} |
| 26 | + |
| 27 | +const logger = { |
| 28 | + prefix: 'INFO:', |
| 29 | + log(...args) { |
| 30 | + // print.apply(logger, [this.prefix, ...args]); |
| 31 | + print.apply(null, [this.prefix, ...args]); // можно не указывать объект/logger, т.к. в print нет отработки this |
| 32 | + }, |
| 33 | +}; |
| 34 | + |
| 35 | +logger.log('Пользователь залогинился', 'ID: 123'); // "INFO: Пользователь залогинился ID: 123" |
| 36 | +logger.log('Данные успешно сохранены'); // "INFO: Данные успешно сохранены" |
| 37 | + |
| 38 | +// Задание 3: |
| 39 | +// Представьте, что у вас есть одна универсальная функция для отправки уведомлений на сайте: sendNotification(type, message, duration). |
| 40 | +// Ваша задача: На основе этой одной функции создать две новые, более специализированные: |
| 41 | +// 1. sendErrorNotification: должна принимать только message и duration, а type у неё всегда должен быть 'error'. |
| 42 | +// 2. sendSuccessNotification: должна принимать только message, а type у неё всегда 'success' и duration всегда 5000. |
| 43 | +// Используйте bind, где это возможно. Если bind не подходит, используйте другой метод. |
| 44 | + |
| 45 | +function sendNotification(type, message, duration) { |
| 46 | + console.log(`[${type}] ${message} (будет видно ${duration}ms)`); |
| 47 | +} |
| 48 | + |
| 49 | +const sendErrorNotification = sendNotification.bind(null, 'error'); |
| 50 | +const sendSuccessNotification = (message) => { |
| 51 | + sendNotification('success', message, 5000); |
| 52 | +}; // ?? пример custom функции обвёртки.. в bind(), нельзя пропустить параметр |
| 53 | + |
| 54 | +sendErrorNotification('Не удалось загрузить данные', 3000); // [error] Не удалось загрузить данные (будет видно 3000ms) |
| 55 | +sendSuccessNotification('Профиль успешно обновлён'); // [success] Профиль успешно обновлён (будет видно 5000ms) |
| 56 | + |
| 57 | +// Задание 4: |
| 58 | +// У нас есть объект calculator с методом add, который должен складывать числа. Сам calculator не умеет складывать, но у него есть доступ к универсальной функции sum, которая принимает массив чисел и возвращает их сумму. |
| 59 | +// Ваша задача: Реализовать метод calculator.add. Он должен принимать любое количество чисел в качестве аргументов. Внутри этого метода вам нужно вызвать глобальную функцию sum, передав ей все аргументы, полученные методом add. |
| 60 | +// Используйте call или apply для решения. |
| 61 | + |
| 62 | +function sum(numbers) { |
| 63 | + return numbers.reduce((acc, current) => acc + current, 0); |
| 64 | +} |
| 65 | + |
| 66 | +const calculator = { |
| 67 | + add(...args) { |
| 68 | + return sum.call(null, args); |
| 69 | + }, |
| 70 | +}; |
| 71 | + |
| 72 | +const result1 = calculator.add(1, 2, 3); |
| 73 | +console.log(result1); // 6 |
| 74 | + |
| 75 | +const result2 = calculator.add(10, 20, 30, 40); |
| 76 | +console.log(result2); // 100 |
0 commit comments