Паттерн Constructor — «JavaScript Design Patterns, 2017» Эдди Османи. Перевод: часть 2

Оригинальный текст — https://addyosmani.com/


Паттерны проектирования Javascript

Разработчики частенько задаются вопросом, существует ли идеальный паттерн или набор паттернов, которые они должны использовать в рабочем процессе. Хорошего ответа на этот вопрос не существует. Каждый сценарий и веб-приложение, над которым мы работаем, скорее всего, будут иметь свои собственные индивидуальные потребности, и нам нужно подумать о том, что какую ценность может предложить тот или иной паттерн.

Например, некоторые проекты могут извлечь выгоду из паттерна Observer, в то время как другие могут просто быть слишком маленькими для его использования.

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

 

Паттерн Constructor

В классических объектно-ориентированных языках программирования конструктор представляет собой специальный метод, используемый для инициализации вновь созданного объекта. В JavaScript, почти все является объектом, поэтому нас должны очень интересовать конструкторы объектов.

Конструкторы объектов используются для создания определенных типов объектов. В них объект готовится к использованию, принимая для этого аргументы, которые конструктор может использовать для установки значений свойствам и методам элемента.

Создание объекта

Три варианта создания объекта в JavascriptЖ

Четыре способа, установки объекту ключа и значения:

Как мы увидим чуть позже, эти методы могут даже использоваться для наследования:

Используем конструктор

Как мы знаем, JavaScript не поддерживает концепцию классов, но поддерживает специальные функции-конструкторы, которые работают с объектами. Вызвав в коде функцию-конструктор с ключевым словом new, мы говорим, чтобы функция вела себя как конструктор и создала новый объект с элементами, определенными этой функцией.

Внутри конструктора ключевое слово this ссылается на новый создаваемый объект (это очень важно понимать).

Это достаточно простой пример использования паттерна. Но в нём есть проблема: один и тот же метод toString будет определен буквально у каждого нового объекта Car, что не является хорошей практикой. Нужно чтобы все объекты ссылались на один метод.

Мы можем обойти эти проблемы следующим паттерном:

Паттерн Constructor с использованием прототипов

Функции, как и все объекты в JavaScript, содержат объект «прототип». Когда мы вызываем конструктор JavaScript для создания объекта, все свойства прототипа конструктора cтановятся доступными для нового объекта. Таким образом, могут быть созданы несколько объектов автомобилей, которые получают доступ к одному и тому же прототипу. Таким образом, мы можем расширить исходный пример следующим образом:

Метод toString () теперь будет разделяться между всеми объектами Car.