|
@@ -1,15 +1,20 @@
|
|
|
# Домашнее задание: ООП в функциональном стиле.
|
|
|
|
|
|
## ООП: база.
|
|
|
-- Напишите конструктор класса `Person` со следующими параметрами:
|
|
|
+### Initialize
|
|
|
+Напишите конструктор класса `Person` со следующими параметрами:
|
|
|
`name`, `surname`, `age`, `sex`, `salary`, `married`, сохраняемыми в полях объекта.
|
|
|
-- Напишите конструктор класса `Person` с теми же параметрами, что и в предыдущей задаче. Поля должны хранится в *замыкании*. Для задания и чтения
|
|
|
+### Closure getters and setters
|
|
|
+Напишите конструктор класса `Person` с теми же параметрами, что и в предыдущей задаче. Поля должны хранится в *замыкании*. Для задания и чтения
|
|
|
параметров напишите набор *геттеров и сеттеров*: `getName`, `setName`, `getSurname`, `setSurname`, `getAge`,
|
|
|
`setAge`, `getSex`, `setSex`, `getSalary`, `setSalary`, `getMarried`, `setMarried`. Каждый из сеттер должен проверять данные.
|
|
|
Если данные некорректны, данные внутри замыкания не изменяются.
|
|
|
**Сеттер** всегда возвращает *текущее* значение переменной. См. [пример](http://gitlab.a-level.com.ua/gitgod/FrontendLectures/src/master/07ObjectsFunctionalStyle.md#--)
|
|
|
-- Добавьте возможность задавать родительский объект с помощью метода `setFather`
|
|
|
-- Добавьте к предыдущем заданию метод `getFatherName`, которое создает строку с отчеством, добавляя суффикс "-ович" для мужчин и "-овна" для женщин
|
|
|
+
|
|
|
+### setFather
|
|
|
+Добавьте возможность задавать родительский объект с помощью метода `setFather`
|
|
|
+### getFatherName
|
|
|
+Добавьте к предыдущем заданию метод `getFatherName`, которое создает строку с отчеством, добавляя суффикс "-ович" для мужчин и "-овна" для женщин
|
|
|
|
|
|
```javascript
|
|
|
var father = new Person("Ivan", "Petrov", 50, "male", 100500, true)
|
|
@@ -19,7 +24,8 @@ daughter.setFather(father)
|
|
|
daughter.getFatherName() // => "Ivanovna"
|
|
|
```
|
|
|
|
|
|
-- Добавьте к предыдущем заданию метод `addChild`, который добавляет ребенка в массив в замыкании и возвращает количество детей. При добавлении проверяйте разницу в возрасте, она должна быть хотя бы лет 15.
|
|
|
+### addChild
|
|
|
+Добавьте к предыдущем заданию метод `addChild`, который добавляет ребенка в массив в замыкании и возвращает количество детей. При добавлении проверяйте разницу в возрасте, она должна быть хотя бы лет 15.
|
|
|
Так же не позволяйте дублировать детей в массиве.
|
|
|
|
|
|
```javascript
|
|
@@ -27,7 +33,8 @@ father.addChild(daughter)
|
|
|
```
|
|
|
|
|
|
## Замыкания
|
|
|
-- Напишите функцию `makeCounter`, которая определяет переменную `counter` и возвращает другую функцию, увеличивающую `counter` каждый вызов и возвращающую её значение:
|
|
|
+### makeCounter
|
|
|
+Напишите функцию `makeCounter`, которая определяет переменную `counter` и возвращает другую функцию, увеличивающую `counter` каждый вызов и возвращающую её значение:
|
|
|
|
|
|
```javascript
|
|
|
var counter = makeCounter()
|
|
@@ -42,7 +49,8 @@ father.addChild(daughter)
|
|
|
|
|
|
counter() // 3
|
|
|
```
|
|
|
-- Напишите код, который будет делать обратный ежесекундный отсчёт в консоли, используя `console.log`. Используйте **Self Invoked Function** для создания замыкания и
|
|
|
+### Final Countdown
|
|
|
+Напишите код, который будет делать обратный ежесекундный отсчёт в консоли, используя `console.log`. Используйте **Self Invoked Function** для создания замыкания и
|
|
|
`setTimeout` для задержки вывода. Результатом должно быть:
|
|
|
|
|
|
```javascript
|
|
@@ -54,7 +62,8 @@ father.addChild(daughter)
|
|
|
поехали!
|
|
|
```
|
|
|
|
|
|
-- Напишите функцию `makeProfileTimer`, которая служит для замера времени выполнения другого кода и работает следующим образом:
|
|
|
+### makeProfileTimer
|
|
|
+Напишите функцию `makeProfileTimer`, которая служит для замера времени выполнения другого кода и работает следующим образом:
|
|
|
|
|
|
```javascript
|
|
|
var timer = makeProfileTimer()
|
|
@@ -64,7 +73,8 @@ father.addChild(daughter)
|
|
|
```
|
|
|
Используйте `performance.now()`
|
|
|
|
|
|
-- Напишите функцию `getSaver`, которая:
|
|
|
+### getSaver
|
|
|
+Напишите функцию `getSaver`, которая:
|
|
|
|
|
|
```javascript
|
|
|
var saver = getSaver(Math.random) //создает функцию-хранилище результата переданной в качестве параметра функции (Math.random
|
|
@@ -79,7 +89,8 @@ father.addChild(daughter)
|
|
|
0. Навсегда сохраняет результат функции. Это актуально, например, для `Math.random`.
|
|
|
1. Действует *лениво*, то есть вызывает `Math.random` только тогда, когда результат *действительно* нужен. Если же по каким-то причинам значение не понадобится, то `Math.random` даже не будет вызыван
|
|
|
|
|
|
-- Изучите встроенную функцию `bind`, и сделайте свою версию, которая позволит определить "значение по умолчанию" не только для первых параметров, но для любых других, например для *степени* в Math.pow:
|
|
|
+### myBind
|
|
|
+Изучите встроенную функцию `bind`, и сделайте свою версию, которая позволит определить "значение по умолчанию" не только для первых параметров, но для любых других, например для *степени* в Math.pow:
|
|
|
|
|
|
```javascript
|
|
|
var pow5 = myBind(Math.pow, Math, [undefined, 5]) // первый параметр - функция для биндинга значений по умолчанию,
|
|
@@ -99,4 +110,7 @@ var someNumber = zeroPrompt("Введите число") // выз
|
|
|
|
|
|
## Рекурсия
|
|
|
|
|
|
+### Sum
|
|
|
+Напишите функцию, который будет считать сумму арифметической прогрессии рекурсивно.
|
|
|
+### HTML Tree
|
|
|
Сделать [задание на синий пояс](http://gitlab.a-level.com.ua/gitgod/FrontendLectures/src/master/04AssociativeArraysHomeWork.md#----1), используя рекурсию, без ограничения вложенности.
|