> For the complete documentation index, see [llms.txt](https://andersenlab.gitbook.io/javascript/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://andersenlab.gitbook.io/javascript/advanced-javascript/oop-in-javascript.md).

# OOP in Javascript

## Объектно-ориентированное программирование <a href="#object-oriented_programming" id="object-oriented_programming"></a>

Объектно-ориентированное программирование (ООП) — это парадигма программирования, которая использует [абстракции](https://developer.mozilla.org/ru/docs/Glossary/абстракции), чтобы создавать модели, основанные на объектах реального мира. ООП использует несколько техник из ранее признанных парадигм, включая [модульность](https://developer.mozilla.org/ru/docs/Glossary/модульность), [полиморфизм](https://developer.mozilla.org/ru/docs/Glossary/полиморфизм) и [инкапсуляция](https://developer.mozilla.org/ru/docs/Glossary/инкапсуляция). На сегодняшний день многие популярные языки программирования (такие как Java, JavaScript, C#, C++, Python, PHP, Ruby и Objective-C) поддерживают ООП.

ООП представляет программное обеспечение как совокупность взаимодействующих объектов, а не набор функций или просто список команд (как в традиционном представлении). В ООП каждый объект может получать сообщения, обрабатывать данные и отправлять сообщения другим объектам. Каждый объект может быть представлен как маленькая независимая машина с отдельной ролью или ответственностью.

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

## Прототипное программирование <a href="#prototipnoe_programmirovanie" id="prototipnoe_programmirovanie"></a>

Прототипное программирование — это модель ООП, которая не использует классы, а вместо этого сначала выполняет поведение класса и затем использует его повторно (эквивалент наследования в языках на базе классов), декорируя (или расширяя) существующие объекты *прототипы*. (Также называемое бесклассовое, прототипно-ориентированное, или экземплярно-ориентированное программирование.)

Оригинальный (и наиболее каноничный) пример прототипно-ориентированного языка это [Self](https://ru.wikipedia.org/wiki/Self%20\(programming%20language\)), разработанный Дэвидом Ангаром и Ренделлом Смитом. Однако бесклассовый стиль программирования стал набирать популярность позднее и был принят для данных языков программирования.

## Объектно-ориентированное программирование в JavaScript <a href="#javascript_object_oriented_programming" id="javascript_object_oriented_programming"></a>

### Пространство имён <a href="#prostranstvo_imyon" id="prostranstvo_imyon"></a>

Пространство имён — это контейнер, который позволяет разработчикам собрать функциональность под уникальным именем приложения. **Пространство имен в JavaScript — это объект, содержащий методы, свойства и другие объекты.**

Принцип работы пространства имен в JS прост: создать один глобальный объект и все переменные, методы и функции объявлять как свойства этого объекта. Также использование пространств имен снижает вероятность возникновения конфликтов имен в приложении, так как каждый объект приложения является свойством глобального объекта.

```javascript
// Глобальное пространство имён
var MYAPP = MYAPP || {};
```

Во фрагменте кода выше мы сначала проверяем, определен ли объект MYAPP (в текущем файле или другом файле). Если да, то используем существующий глобальный объект MYAPP, иначе создаем пустой объект MYAPP, в котором мы инкапсулируем все методы, функции, переменные и объекты.

Также мы можем создать подпространство имён (учтите, что сначала нужно объявить глобальный объект):

```javascript
// Подпространство имён
MYAPP.event = {};
```

Далее следует пример синтаксиса создания пространства имен и добавления переменных, функций и методов:

```javascript
// Создаём контейнер MYAPP.commonMethod для общих методов и свойств
MYAPP.commonMethod = {
  regExForName: "", // определяет регулярное выражение для валидации имени
  regExForPhone: "", // определяет регулярное выражение для валидации телефона
  validateName: function(name){
    // Сделать что-то с name, вы можете получить доступ к переменной regExForName
    // используя "this.regExForName"
  },

  validatePhoneNo: function(phoneNo){
    // Сделать что-то с номером телефона
  }
}

// Объект вместе с объявлением методов
MYAPP.event = {
    addListener: function(el, type, fn) {
    // код
    },
    removeListener: function(el, type, fn) {
    // код
    },
    getEvent: function(e) {
    // код
    }

    // Можно добавить другие свойства и методы
}

// Синтаксис использования метода addListener:
MYAPP.event.addListener("yourel", "type", callback);
```
