# Начала Объектно-Ориентированного Программирования.

## Ассоциативный массив как объект

Объекты в **JS** совпадают с ассоциативными массивами. Наряду со строками, числами и прочими типами данных, вы можете занести в ассоциативный
массив функцию:

```javascript
var person = {
    name: "Ivan",
    surname: "Ivanov",
    alert: function(text){
        alert(text);
    }
}

var person2     = {};
person2.name    = "Donald";
person2.surname = "Trump";
person2.alert   = function(text){
    alert(text);   
}

person.alert(person.name);
person2.alert(person2.name);
```

Таким образом вы можете объединять код и данные в одной структуре. Возможность объединения  данных и кода, который с ними работает, в одном *объекте*
является одной из основополагающих свойств ООП и называется **инкапсуляцией**. Функция, которая относится к объекту, называется **методом**.

## `this`

Для обращения к полям *этого* объекта применяется ключевое слово `this`, которая ссылается на объект, к которому относится этот метод:

```javascript
var person = {
    name: "Ivan",
    surname: "Ivanov",
    sayHi: function(){
        alert("Hi," + this.getFullName());
    }

    getFullName: function(){
        return this.surname + " " + this.name
    }
}

person.sayHi()
```

`this` обычно равен тому, что написано перед точкой при вызове (`person.sayHi()` - `this` будет равен `person`)

## Функция - Конструктор

Для создания объектов определенного типа применяется **функция-конструктор**, результатом работы которой становится новый объект. Вызов конструктора
происходит не обычным способом, а с использованием оператора `new`

```javascript
function Person(){
}

var person = new Person()
```

Пример выше создает пустой объект с именем класса `Person`:

```javascript
person
typeof person
```

По всеобщей договоренности, функции-конструкторы именуются с большой буквы (`Person`). Для создания нового объекта используется оператор `new`, 
который создает пустой объект, заносит в него определенное множество технической информации и передает его как `this` в конструктор:


```javascript
function Person(name, surname){
    this.name    = name
    this.surname = surname
}

var person = new Person("Ivan", "Petroff")
```

Обратите внимание, что конструктор ничего не возращает, используя `return`. Считается что он возвращает новый объект, для этого достаточно просто 
заполнить нужные поля в `this`.

## Методы

Так же как данные, мы можем задать определенные методы объекту:


```javascript

function Person(name, surname){
    this.name    = name
    this.surname = surname

    this.getFullName = function(){
        return this.name + (this.fatherName ? " " + this.fatherName + " " : " ") + this.surname
    }
}

var person        = new Person("Ivan", "Petroff")
alert(person.getFullName())

person.fatherName = "Sydorych"
alert(person.getFullName())

```