JavaScript/Функция-конструктор

Материал из Энциклопедия о программировании
Перейти к: навигация, поиск

Функция-конструктор — специальная дополнительная роль пользовательских функций в JS.

Функцией-конструктором в JS может быть любая функция, отвечающая неким условиям, а именно: функция-конструктор либо совсем ничего не возвращает, либо возвращает примитивный тип данных, т.е. не объект. Во 2-ом случае, когда функция возвращает примитивный тип, её можно использовать как функцию-конструктор, но при этом она не будет возвращать, то что должна, т.е. ключ. слово return в этом случае будет игнорироваться.

Функционал

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

Объекты на основе функциии-конструктора создаются с помощью ключ. слова new. При создании «объекта функции» возможные параметры передаются не в конструктор, как в случае с классом в классическом ОПП, а в саму функцию-конструктор.

При этом создаётся потомок не от самой функции-конструктора, а от её прототипа, т.е. у возвращаемого объекта прототипом будет прототип функции-конструктора.

Именование

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

Примеры

Ключевое слово this это контекст вызова. Если функция вызывается как конструктор, то слово this будет указывать на создаваемый объект:

function Human(parameter){
   this.gender = parameter;
}
var alex = new Human('Мужчина');

alert(alex.gender);

Создаём функцию-конструктор с названием Human, а в неё передаём параметр parameter. В теле функции с помощью зарезервированного ключ. слова this обращаемся к объекту, который вызвал эту функцию, и задаём ему св-во gender, в которое заносим значение parameter, что и было передано в функцию при её вызове.

Создаём переменную alex: с помощью ключ. слова new создаём объект этой функции-конструктора, и передаём в этот конструктор значение в виде обычного литерала. После этого объект и создаётся. Доступ к объекту можно получить через ссылочную переменную alex, и его св-во gender будет иметь знач. "Мужчина", т.к. мы этот аргумент передали в конструктор при создании объекта.

Выводим знач. св-ва gender созданного объекта.

С помощью функции-конструктора объекты можно наделять не только св-вами, но и методами. Пример:

function Human(parameter){
   this.gender = parameter;
   this.name = function() {
       alert(parameter);  
   }
}
var alex = new Human('Мужчина');
alex.name();
alex.newProperty = 'Новое свойство!';

Здесь в св-во name заносится анонимная функция, которая выводит аргумент parameter. Т.о. name является методом объекта. Далее идёт создание объекта. После идёт вызов метода name() с помощью обращения к нему через ссылку на объект. В след. строке показан пример создания св-ва объекта вне функции-конструктора.

Использование прототипа функции-конструктора
function Human(name) {
	this.name = name;
}
Human.prototype.say = function(what) {
	console.log(this.name + " : " + what);
}
var alex = new Human("Alex");
alex // {name: 'Alex'}
alex.say("hello!"); // Alex : hello!

У объекта alex есть метод say несмотря на то, что в функции-конструкторе Human он не прописан. Всё потому, что функция-конструктор возвращает объект со своим же прототипом.