# Домашнее задание: ООП в функциональном стиле. 0. Напишите конструктор класса `Person` со следующими параметрами: `name`, `surname`, `fatherName`, `age`, `sex`, `salary`, `married`, сохраняемыми в полях объекта. 1. Напишите конструктор класса `Person` с теми же параметрами, что и в предыдущей задаче. Поля должны хранится в *замыкании*. Для задания и чтения параметров напишите набор *геттеров и сеттеров*: `getName`, `setName`, `getSurname`, `setSurname`, `getFatherName`, `setFatherName`, `getAge`, `setAge`, `getSex`, `setSex`, `getSalary`, `setSalary`, `getMarried`, `setMarried`. Каждый из сеттер должен *валидировать* (проверять) данные. Если данные некорректны, данные внутри замыкания не изменяются. **Сеттер** всегда возвращает *текущее* значение переменной. См. [пример](http://gitlab.a-level.com.ua/gitgod/FrontendLectures/src/master/07ObjectsFunctionalStyle.md#--) 2. Напишите функцию `makeCounter`, которая определяет переменную `counter` и возвращает другую функцию, увеличивающую `counter` каждый вызов и возвращающую её значение: ```javascript var counter = makeCounter() var otherCntr = makeCounter() counter1() // 1 counter1() // 2 otherCntr() // 1 otherCntr() // 2 otherCntr() // 3 counter1() // 3 ``` 2. Напишите код, который будет делать обратный ежесекундный отсчёт в консоли, используя `console.log`. Используйте **Self Invoked Function** для создания замыкания и `setTimeout` для задержки вывода. Результатом должно быть: ``` 5 //пауза 1 секунда 4 //пауза 1 секунда 3 //пауза 1 секунда 2 //пауза 1 секунда 1 //пауза 1 секунда поехали! ``` 3. Напишите функцию `makeProfileTimer`, которая служит для замера времени выполнения другого кода и работает следующим образом: ```javascript var timer = makeProfileTimer() doSomething(); //некий код, время выполнения которого мы хотим замерить с высокой точностью alert(timer()); //alert должен вывести время в микросекундах от выполнения makeProfileTimer до момента вызова timer(), т. е. замерить время выполнения doSomething ```