Домашнее задание: ООП в функциональном стиле.
- Напишите конструктор класса
Person
со следующими параметрами:
name
, surname
, fatherName
, age
, sex
, salary
, married
, сохраняемыми в полях объекта.
- Напишите конструктор класса
Person
с теми же параметрами, что и в предыдущей задаче. Поля должны хранится в замыкании. Для задания и чтения
параметров напишите набор геттеров и сеттеров: getName
, setName
, getSurname
, setSurname
, getFatherName
, setFatherName
, getAge
,
setAge
, getSex
, setSex
, getSalary
, setSalary
, getMarried
, setMarried
. Каждый из сеттер должен валидировать
(проверять) данные. Если данные некорректны, данные внутри замыкания не изменяются.
Сеттер всегда возвращает текущее значение переменной. См. пример
- Напишите функцию
makeCounter
, которая определяет переменную counter
и возвращает другую функцию, увеличивающую counter
каждый вызов и возвращающую её значение:
|> click here to run code var counter = makeCounter()
var otherCntr = makeCounter()
counter1()
counter1()
otherCntr()
otherCntr()
otherCntr()
counter1()
- Напишите код, который будет делать обратный ежесекундный отсчёт в консоли, используя
console.log
. Используйте Self Invoked Function для создания замыкания и
setTimeout
для задержки вывода. Результатом должно быть:
|> click here to run code 5
4
3
2
1
поехали!
- Напишите функцию
makeProfileTimer
, которая служит для замера времени выполнения другого кода и работает следующим образом:
|> click here to run code var timer = makeProfileTimer()
doSomething();
alert(timer());
Используйте `performance.now()`
- Напишите функцию
getSaver
, которая:
|> click here to run code var saver = getSaver(Math.random)
var value1 = saver()
var value2 = saver()
value1 === value2
Таким образом `getSaver` решает две задачи:
0. Навсегда сохраняет результат функции. Это актуально, например, для `Math.random`.
1. Действует *лениво*, то есть вызывает `Math.random` только тогда, когда результат *действительно* нужен. Если же по каким-то причинам значение не понадобится, то `Math.random` даже не будет вызыван
- Изучите встроенную функцию
bind
, и сделайте свою версию, которая позволит определить "значение по умолчанию" не только для первых параметров, но для любых других, например для степени в Math.pow:
|> click here to run codevar pow5 = myBind(Math.pow, Math, [undefined, 5])
pow5(2)
var zeroPrompt = myBind(prompt, window, [undefined, "0"])
var someNumber = zeroPrompt("Введите число")
Массив, который идет третьим параметром определяет, какие поля должны подменяться значением по умолчанию, а какие - задаваться в последствии (undefined).