Конструкторы
1. Конструкторы
Обычный синтаксис литерала объекта {}
позволяет создать один объект. Но зачастую нужно создать много однотипных объектов динамически во время выполнения программы. Для этого используют функции-конструкторы, вызывая их при помощи специального оператора new
.
Конструктор — это обычная функция, к которой применили оператор new
. Это приводит к созданию нового объекта и вызову функции в контексте этого объекта.
Любая функция, кроме стрелочной, может быть использована как конструктор, то есть вызвана при помощи оператора new
. При вызове стрелки через new
будет ошибка.
Чтобы отличить конструктор от обычной функции, конструкторы принято называть с большой буквы, а в самом названии отражать тип создаваемого объекта. Мы уже работали с конструкторами встроенными в язык: Object
, Array
, Number
, String
и другие.
Процесс создания объекта через конструктор происходит следующим образом:
Создаётся новый пустой объект.
Функция-конструктор вызывается в контексте этого объекта.
Ключевое слово
this
внутри конструктора получает ссылку на этот объект.Конструктор выполняется и, как правило, модифицирует
this
(созданный объект), добавляя свойства и методы.Возвращается
this
.
Если визуализировать происходящее, то при вызове new Hotel
происходит следующее (первая и последняя строка — это то, что делает интерпретатор).
Теперь многократными вызовами new Hotel
с разными аргументами мы можем создать любое количество объектов. Использование конструкторов удобно при создании множества объектов с одним набором свойств, имеющих разные значения. Поэтому такую функцию и называют конструктором — она предназначена для конструирования объектов по заранее подготовленному шаблону.
2. Внутренние методы [[Call]] и [[Construct]]
Функции вызываются используя два разных внутренних метода: [[Call]]
и [[Construct]]
.
Когда функция вызывается без
new
, выполняется метод[[Call]]
, который исполняет тело функции так, как оно описано в коде.Когда функция вызывается с
new
, выполняется метод[[Construct]]
, который отвечает за создание нового объекта и исполнения тела функции сthis
, ссылающимся на этот объект.
Не все функции имеют внутренний метод [[Construct]]
и поэтому не все функции могут быть вызваны через new
. Стрелочные функции не имеют метода [[Construct]]
и поэтому не могут быть использованы в качестве конструкторов.
3. Добавление методов
Использование функций для создания объекта дает большую гибкость. Можно передавать конструктору параметры, определяющие как его создавать и он будет создавать объекты заданным образом.
Добавим метод в создаваемый объект. Например, пусть Hotel
имеет методы для приветствия гостя и добавления и удаления количества гостей в поле guestCount
. Проверки на вместительность пропустим.
4. Управляем магазином
Время практики. Представьте, что у нас есть магазин и два менеджера, по продаже товаров. Необходимо написать логику для организации их работы. Для каждого менеджера создаётся отдельный объект.
Это было просто и всё работает хорошо, но мы буквально захардкодили менеджеров заранее. Представьте что будет, когда наш магазин вырастет и пополнится парой сотен менеджеров, для каждого из которых будет необходимо создать объект динамически во время выполнения программы. Очевидно, что создавать объекты подобным способом — не самая лучшая затея. К счастью, мы знаем о конструкторах.
Теперь, когда мы узнаем как работать с HTML-документом, нам не страшно любое количество менеджеров. Собрав поля из форм регистрации, можно динамически создавать объекты по введенной информации.
Last updated