# Начала ООП: ДЗ. ## Тестовый код Ниже будет встречаться тестовый код, который, будучи запущен после выполненной части задания должен корректно отработать, т. е. без синтаксических ошибок и с ожидаемыми результатами. Если вы во вкладке с заданиями откроете **Developer Tools** и вставите туда свой код, то для проверки достаточно сделать "click here to run code" и посмотреть на результаты ## Person Расширьте функцию-конструктор `Person` следующими полями и возможностями: ### `age` Добавьте поле `age` в параметры конструктора ```javascript var agedPerson1 = new Person("Ivan", "Ivanovv", 45) agedPerson1.age // => 45 var agedPerson2 = new Person("Barak", "Kennedy", 15) agedPerson2.age // => 15 ``` ### `hasPassport` Добавьте функцию-метод (т. е. функцию объекта), которая возвращает, есть ли паспорт у персоны, отталкиваясь от возраста. ```javascript var agedPerson1 = new Person("Ivan", "Ivanovv", 45) agedPerson1.hasPassport(); // true var agedPerson2 = new Person("Barak", "Kennedy", 15) agedPerson2.hasPassport(); // false ``` ## PhoneNumber Создайте функцию-конструктор `PhoneNumber`, с двумя параметрами: - `number` - строка с номером телефона - `type` - тип номера, один из трех вариантов: `home`, `office`, `mobile` ```javascript var policeNumber = new PhoneNumber("+380577102", "office") policeNumber // => PhoneNumber{number: "+380577102", type: "office"} var medNumber = new PhoneNumber("+380577103", "mobile") medNumber // => PhoneNumber{number: "+380577103", type: "mobile"} ``` ## Person и PhoneNumber ### Person #### `addNumber` Создайте функцию-метод, которая будет добавлять номер телефона (объект `PhoneNumber`) во внутренний массив `phones` объекта Person. Делайте проверку на повтор и не добавляйте номер, если он уже присутствует в массиве `phones` ```javascript var agedPerson1 = new Person("Ivan", "Ivanovv", 45) var phoneNum = new PhoneNumber("+380671234567", "mobile") agedPerson1.addNumber(new PhoneNumber("+380577123456", "home")) agedPerson1.addNumber(phoneNum) agedPerson1.addNumber(phoneNum) // добавить не должно, должна сработать проверка на повтор ``` #### `getNumbers` Создайте функцию-метод, которая будет возвращать список номеров (массив `phones`) ```javascript agedPerson1.getNumbers() // массив с двумя объектами PhoneNumber после предыдущего тестового кода ``` ### PhoneNumber #### `addOwner` Создайте функцию-метод, которая будет добавлять владельца номера телефона (объект `Person`) во внутренний массив `owners` объекта PhoneNumber. Не позволяйте дублировать владельца. Так же не позволяйте добавлять более одного владельца для мобильных номеров, это разрешено только для офисных и домашних номеров телефонов (`type` "office" и "home") ```javascript var policeNumber = new PhoneNumber("+380577102", "office") var medNumber = new PhoneNumber("+380577103", "mobile") var agedPerson1 = new Person("Ivan", "Ivanovv", 45) var agedPerson2 = new Person("Barak", "Kennedy", 15) policeNumber.addOwner(agedPerson1) policeNumber.addOwner(agedPerson2) medNumber.addOwner(agedPerson1) medNumber.addOwner(agedPerson2) // не должно добавить, так как medNumber - мобильный номер, относящийся только к одному владельцу ``` #### `getOwners` Создайте функцию-метод, которая будет возвращать список владельцев (массив `owners`). Для мобильных номеров возвращайте не массив с одним элементом, а напрямую единственного владельца. ```javascript medNumber.getOwners() // => один объект Person policeNumber.getOwners() // => массив объектов-владельцев номера ``` ### Всё вместе. Обеспечьте двойную связность номеров и людей: при добавлении номера к человеку, в номер должна заносится связь с человеком. И наоборот, при добавлении человека как владельца номера, к персоне должна добавляться связь с номером. ```javascript var newPerson = new Person("Lee", "See-Tsyn", 35) var newNumber = new PhoneNumber("+380667654321", "mobile") newNumber.addOwner(newPerson) newPerson.getNumbers() // => массив из одного номера телефона, который хранится в newNumber var anotherNumber = new PhoneNumber("+380681231231", "mobile") newPerson.addNumber(anotherNumber) anotherNumber.getOwners() // => newPerson ```