Функция-конструктор - это функция для создания объекта. В javascript, чтобы функция возвращала объект, перед вызовом функции следует поставить ключевое слово «новый».

Механизм Javascript творит чудеса, описанные ниже, когда обнаруживает ключевое слово «новый» перед функцией:

1. Создает пустой объект A.

2. Он связывает переменную this функции конструктора с объектом A.

3. Свойства и методы, к которым обращается this, прикрепляются к объекту A.

4. Механизм Javascript устанавливает прототип объекта A в прототип функции-конструктора. (важный!)

5. Если код в функции явно не возвращает объектный объект, механизм JavaScript возвращает объект A в конце функции.

В приведенном ниже фрагменте кода функция Person является функцией-конструктором. Вы можете заметить, что имя «Человек» написано с заглавной буквы. Намерение состоит в том, чтобы напомнить вам, что эта функция является функцией-конструктором и при вызове должна возвращать объект. Имейте в виду, что вам нужно добавить ключевое слово «новый», чтобы функция конструктора возвращала вам объект.

При этом некоторые программисты могут вызывать функцию без ключевого слова «новый». Ну что происходит? Поскольку движок Javascript не обнаруживает ключевое слово «новое», он не выполняет никаких магических действий, указанных выше, и вместо этого возвращает undefined.

Этого можно избежать, изменив функцию-конструктор:

Статические методы и методы экземпляра

Ключевое слово «новый» сообщает механизму Javascript назначить прототип функции конструктора прототипу созданного объекта. Это жизненно важно, потому что этот шаг гарантирует, что все методы, которые вы добавили в прототип функций конструктора, доступны для объекта, поскольку они находятся в цепочке прототипов этого объекта.

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

Что, если мы хотим вызвать функцию без создания экземпляра объекта - статический метод? Мы можем легко добиться этого, добавив функцию к функции-конструктору, потому что эта функция добавляется к функции-конструктору, а не к прототипу функции-конструктора, поэтому она НЕ в цепочке прототипов объект.