Skip to content

Commit 515e9d8

Browse files
committed
[LES-16.3/st-compl] bind-call-apply-methods
Practice with "bind/call/apply()" meth's. Using "...rest", "wrap" func. Worth noting: - all this lesson/practice (note the solutions). FS-dev: B-3 / JS basic
1 parent 2a129a8 commit 515e9d8

File tree

1 file changed

+76
-0
lines changed
  • full-stack-dev/3-js-basic/16-managing-this/16-3-bind-call-apply-methods

1 file changed

+76
-0
lines changed
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
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

Comments
 (0)