Constructor
Конструктор – это функция, предназначенная для инициализации вновь созданных объектов.
Конструкторы вызываются с помощью ключевого слова new
. Применение ключевого слова new
при вызове конструктора автоматически создает новый объект, поэтому конструктору остается только инициализировать свойства этого нового объекта. Важной особенностью вызова конструктора является использование свойства prototype
конструктора в качестве прототипа нового объекта. Это означает, что все объекты, созданные с помощью одного конструктора, наследуют один и тот же объект-прототип и, соответственно, являются членами одного и того же класса.
Конструктор - это функции, задачей которых является заполнить пустой объект свойствами и методами. Т.е. это функция, которая конфигурирует объект для дальнейшего использования.
Функция-конструктор - это эквивалент классам в других языках программирования. (?)
Например:
var point = new Object();
В JS конструкторы — это всего лишь функции, которые, так уж получилось, были вызваны с операцией new
перед ними. Они ни связаны с классами, ни создают экземпляров классов. Они — даже не особые типы функций. Они — всего лишь обычные функции, которые, по своей сути, "украдены" операцией new
при их вызове.
Например, функцияNumber(..)
действует как конструктор, цитируя спецификацию ES5.1:
15.7.2 Конструктор Number
Когда Number вызывается как часть выражения new, оно является конструктором: оно инициализирует только что созданный объект.
Так что, практически любая старенькая функция, включая встроенные объектные функции, такие какNumber(..)
, могут вызываться сnew
перед ними и это превратит такой вызов функции в вызов конструктора. Это важное, но едва уловимое различие: нет такой вещи как "функции-конструкторы", а скорее есть вызовы, конструирующие из функций.
Когда функция вызывается с указанием перед нейnew
, также известный как вызов конструктора, автоматически выполняются следующие вещи:
(1) Создается новенький объект (т.е. конструируется) прямо из воздуха
var instance = {};
(2) Только что сконструированный объект связывается с [[Прототипом]]
instance.[[Прототипом]] = FnClass.prototype;
// or
instance.__proto__ = FnClass.prototype;
(3) Только что сконструированный объект устанавливается как привязка this
для этого вызова функции
(4) За исключением тех случаев, когда функция возвращает свой собственный альтернативный объект, вызов функции с new
автоматически вернет только что сконструированный объект.