07ObjectsFunctionalStyleHomeWork.md 7.7 KB

Домашнее задание: ООП в функциональном стиле.

ООП: база.

  • Напишите конструктор класса Person со следующими параметрами: name, surname, age, sex, salary, married, сохраняемыми в полях объекта.
  • Напишите конструктор класса Person с теми же параметрами, что и в предыдущей задаче. Поля должны хранится в замыкании. Для задания и чтения параметров напишите набор геттеров и сеттеров: getName, setName, getSurname, setSurname, getAge, setAge, getSex, setSex, getSalary, setSalary, getMarried, setMarried. Каждый из сеттер должен проверять данные. Если данные некорректны, данные внутри замыкания не изменяются. Сеттер всегда возвращает текущее значение переменной. См. пример
  • Добавьте возможность задавать родительский объект с помощью метода setFather
  • Добавьте к предыдущем заданию метод getFatherName, которое создает строку с корректным именем, добавляя суффикс "-ович" для мужчин и "-овна" для женщин ```javascript var father = new Person("Ivan", "Petrov", 50, "male", 100500, true) var daughter = new Person("Maria", "Petrova", 25, "female", 500, false)

daughter.setFather(father) daughter.getFatherName() // => "Ivanovna"

- Добавьте к предыдущем заданию метод `addChild`, который добавляет ребенка в массив в замыкании и возвращает количество детей. При добавлении проверяйте разницу в возрасте, она должна быть хотя бы лет 15.
  Так же не позволяйте дублировать детей в массиве. 
```javascript
father.addChild(daughter)

Замыкания

  • Напишите функцию makeCounter, которая определяет переменную counter и возвращает другую функцию, увеличивающую counter каждый вызов и возвращающую её значение:
   var counter   = makeCounter()
   var otherCntr = makeCounter()

   counter1() // 1
   counter1() // 2

   otherCntr() // 1
   otherCntr() // 2
   otherCntr() // 3

   counter1() // 3
  • Напишите код, который будет делать обратный ежесекундный отсчёт в консоли, используя console.log. Используйте Self Invoked Function для создания замыкания и setTimeout для задержки вывода. Результатом должно быть:
   5 //пауза 1 секунда
   4 //пауза 1 секунда
   3 //пауза 1 секунда
   2 //пауза 1 секунда
   1 //пауза 1 секунда
   поехали!
  • Напишите функцию makeProfileTimer, которая служит для замера времени выполнения другого кода и работает следующим образом:
   var timer = makeProfileTimer()
   doSomething();  //некий код, время выполнения которого мы хотим измерить с высокой точностью
   alert(timer()); //alert должен вывести время в микросекундах от выполнения makeProfileTimer до момента вызова timer(), 
                   // т. е. измерить время выполнения doSomething

Используйте performance.now()

  • Напишите функцию getSaver, которая:
    var saver = getSaver(Math.random) //создает функцию-хранилище результата переданной в качестве параметра функции (Math.random 
                                      // в примере). На этом этапе Math.random НЕ вызывается
    var value1 = saver()              //saver вызывает переданную в getSaver функцию, запоминает результат и возвращает его
    var value2 = saver()              //saver в дальнейшем просто хранит результат функции, и более НЕ вызывает переданную 
                                      //в getSaver функцию;
    value1 === value2                 // всегда true

Таким образом getSaver решает две задачи:

  1. Навсегда сохраняет результат функции. Это актуально, например, для Math.random.
  2. Действует лениво, то есть вызывает Math.random только тогда, когда результат действительно нужен. Если же по каким-то причинам значение не понадобится, то Math.random даже не будет вызыван
  • Изучите встроенную функцию bind, и сделайте свою версию, которая позволит определить "значение по умолчанию" не только для первых параметров, но для любых других, например для степени в Math.pow:
var pow5 = myBind(Math.pow, Math, [undefined, 5]) // первый параметр - функция для биндинга значений по умолчанию, 
                                                  // второй - this для этой функции, третий - массив, в котором undefined означает
                                                  // параметры, которые должны передаваться при вызове,
                                                  // а другие значения являются значениями по умолчанию:
pow5(2) // => 32, вызывает Math.pow(2,5), соотнесите с [undefined, 5]
var cube = myBind(Math.pow, Math, [undefined, 3]) // cube возводит число в куб
cube(3) // => 27

var zeroPrompt = myBind(prompt, window, [undefined, "0"]) //аналогично, только теперь задается "0" как текст по умолчанию в prompt, 
                                                          //а текст приглашения пользователя задается при вызове zeroPrompt
var someNumber = zeroPrompt("Введите число")              // вызывает prompt("Введите число","0")

Массив, который идет третьим параметром определяет, какие поля должны подменяться значением по умолчанию, а какие - задаваться в последствии (undefined).

Рекурсия

Сделать задание на синий пояс, используя рекурсию.