Skip to content

Commit a464941

Browse files
committed
[TM-16.9/st-compl] training-module
Solving 8 tasks. Working with "this/closure, IIFE, bind/call/apply()". Worth noting: - all this tasks (note the solutions). FS-dev: B-3 / JS basic
1 parent 0b1d9c5 commit a464941

File tree

1 file changed

+222
-0
lines changed
  • full-stack-dev/3-js-basic/16-managing-this/16-9-training-module

1 file changed

+222
-0
lines changed
Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,222 @@
1+
'use strict';
2+
3+
// Задание 1:
4+
// Создайте объект с методом, используя сокращённую запись метода, и продемонстрируйте доступ к свойству объекта через this.
5+
6+
const userName = 'Alice';
7+
8+
const greeter = {
9+
name: userName,
10+
greet() {
11+
console.log(`Привет, ${this.name}! Добро пожаловать!`);
12+
},
13+
};
14+
15+
greeter.greet(); // "Привет, Alice! Добро пожаловать!"
16+
17+
// Задание 2:
18+
// Создайте функцию, которая использует замыкание для хранения приватного счетчика и возвращает объект с методами для работы с этим счетчиком.
19+
20+
const initialValue = 5;
21+
22+
function getClosureCount(initial) {
23+
let count = initial;
24+
25+
return {
26+
countIncrease() {
27+
return ++count;
28+
},
29+
countDecrease() {
30+
return --count;
31+
},
32+
};
33+
}
34+
35+
if (
36+
typeof initialValue !== 'number' ||
37+
!Number.isInteger(initialValue) ||
38+
initialValue < 0 ||
39+
initialValue > 100
40+
) {
41+
console.log(
42+
'Ошибка: initialValue должно быть целым числом от 0 до 100. Замыкание не может быть создано!'
43+
);
44+
} else {
45+
const counter = getClosureCount(initialValue);
46+
const increasedValue = counter.countIncrease();
47+
const decreasedValue = counter.countDecrease();
48+
console.log(
49+
`Начальное значение: ${initialValue}, Увеличенное: ${increasedValue}, Уменьшенное: ${decreasedValue}`
50+
); // "Начальное значение: 5, Увеличенное: 6, Уменьшенное: 5"
51+
}
52+
53+
// Задание 3:
54+
// Создайте функцию, которая принимает объект и возвращает новую функцию с привязанным контекстом для работы с данными этого объекта.
55+
56+
const user = {
57+
name: 'Alice',
58+
age: 25,
59+
city: 'Moscow',
60+
};
61+
62+
function addContext(obj) {
63+
if (!obj || typeof obj !== 'object') {
64+
return () => {};
65+
}
66+
67+
return (key) => {
68+
if (!key || typeof key !== 'string') {
69+
return '';
70+
}
71+
72+
key = key.trim();
73+
74+
if (key in obj) {
75+
return obj[key];
76+
}
77+
78+
return `Нет такого ключа!`;
79+
};
80+
}
81+
82+
const getObjKey = addContext(user);
83+
84+
const getName = getObjKey(' name');
85+
console.log(getName); // "Alice"
86+
87+
const getAge = getObjKey('age');
88+
console.log(getAge); // 25
89+
90+
const getError = getObjKey('hobby');
91+
console.log(getError); // "Нет такого ключа!"
92+
93+
// !! Задание 4:
94+
// Создайте функцию, которая использует IIFE для инициализации приватного объекта с данными и возвращает функцию для доступа к этим данным.
95+
96+
const getIIFEBookContext = (() => {
97+
const book = {
98+
title: 'Изучение JavaScript',
99+
author: 'Иван Петров',
100+
};
101+
102+
return (key) => {
103+
if (!key || typeof key !== 'string') {
104+
return '';
105+
}
106+
107+
key = key.trim();
108+
109+
if (key in book) {
110+
return book[key];
111+
}
112+
113+
return `Нет такого ключа!`;
114+
};
115+
})();
116+
117+
console.log(getIIFEBookContext('title')); // "Изучение JavaScript"
118+
console.log(getIIFEBookContext('author')); // "Иван Петров"
119+
console.log(getIIFEBookContext('pages')); // "Нет такого ключа!"
120+
121+
// !! Задание 5:
122+
// Создайте функцию, которая принимает объект и строку с именем метода, а затем использует call для вызова указанного метода с переданным объектом в качестве контекста.
123+
124+
const person = {
125+
firstName: 'Анна',
126+
lastName: 'Смирнова',
127+
age: 28,
128+
getName() {
129+
return `${this.firstName} ${this.lastName}`;
130+
},
131+
getAge() {
132+
return this.age;
133+
},
134+
};
135+
136+
function callObjMethod(obj, methodName) {
137+
if (!obj || typeof obj !== 'object') {
138+
return '';
139+
}
140+
141+
if (!methodName || typeof methodName !== 'string') {
142+
return '';
143+
}
144+
145+
return obj[methodName].call(obj); // !! только через [ДИНАМИЧЕСКИЙ ключ] обрабатывается переменная, так определяется свойство
146+
}
147+
148+
console.log(callObjMethod(person, 'getName')); // "Анна Смирнова"
149+
console.log(callObjMethod(person, 'getAge')); // 28
150+
151+
// Задание 6:
152+
// Создайте функцию, которая принимает массив чисел и возвращает объект с методами для математических операций над этими числами.
153+
154+
const numbers = [2, 4, 6];
155+
156+
function returnMathMethods(arr) {
157+
if (!arr || !Array.isArray(arr)) {
158+
return '';
159+
}
160+
161+
return {
162+
sum() {
163+
return arr.reduce((acc, num) => acc + num, 0);
164+
},
165+
166+
multiply() {
167+
return arr.reduce((acc, num) => acc * num);
168+
},
169+
170+
average() {
171+
return arr.reduce((acc, num) => acc + num, 0) / arr.length;
172+
},
173+
};
174+
}
175+
176+
const mathObj = returnMathMethods(numbers);
177+
const sum = mathObj.sum();
178+
const multiply = mathObj.multiply();
179+
const average = mathObj.average();
180+
181+
console.log(`Сумма: ${sum}, Произведение: ${multiply}, Среднее: ${average}`); // "Сумма: 12, Произведение: 48, Среднее: 4"
182+
183+
// Задание 7:
184+
// Создайте функцию, которая принимает объект и использует bind для создания новой функции с фиксированным контекстом и предустановленными аргументами.
185+
186+
const a = 8;
187+
const b = 3;
188+
189+
const anotherMathObj = {
190+
multiply(a, b) {
191+
return a * b;
192+
},
193+
};
194+
195+
function multiplyNum(obj) {
196+
return obj.multiply.bind(obj, a, b);
197+
}
198+
199+
const mathMultiply = multiplyNum(anotherMathObj);
200+
const result = mathMultiply();
201+
console.log(`Результат умножения: ${result}`); // "Результат умножения: 24"
202+
203+
// !! Задание 8:
204+
// Напишите логику, которая демонстрирует работу с приватными данными через замыкание и использует apply для вызова методов с массивом аргументов.
205+
206+
const num1 = 4;
207+
const num2 = 7;
208+
209+
const numbersArray = [num1, num2];
210+
211+
function createCalculator() {
212+
function multiply(a, b) {
213+
return a * b;
214+
}
215+
216+
return { performMultiply: multiply };
217+
}
218+
219+
const calculator = createCalculator();
220+
const calcResult = calculator.performMultiply.apply(null, numbersArray);
221+
222+
console.log('Операция выполнена: ' + calcResult); // "Операция выполнена: 28"

0 commit comments

Comments
 (0)