Какви са всички разлики между функцията и функцията конструктор в JavaScript?

В този автор на блог казва, че функцията по-долу е функция конструктор:

function Cat(name, color) {
  this.name = name;
  this.color = color;
}
Cat.prototype.age = 0;

var catC = new Cat("Fluffy", "White");

Екземплярите на функцията Cat имат свойство име и цвят. Това ли е единствената разлика между нормалната и функцията конструктор?


person vimal1083    schedule 14.03.2014    source източник
comment
По-подробен и точен отговор: Как да проверя дали функция на Javascript е конструктор   -  person jinbeom hong    schedule 06.03.2020


Отговори (4)


Функцията конструктор е нормална функция.

Това, което прави разликата тук, е използването на оператора new, който прави контекста (this) във функцията нов екземпляр, като по този начин му позволява да вземе двете свойства и връща този нов екземпляр.

Без оператора new контекстът щеше да бъде външният (window ако вашият код е в глобалния обхват в свободен режим, undefined ако е в строг режим).

Тоест, ако пропуснете new

var catC = Cat("Fluffy", "White");

функцията "работи" (ако не сте в строг режим), но имате два различни резултата:

  • catC е undefined, тъй като вашата функция не връща нищо
  • name и color вече са свойства на външния обхват

Следователно цялата магия е в новия оператор:

Когато кодът new foo(...) се изпълни, се случват следните неща:

Създава се нов обект, наследяващ от foo.prototype.

Функцията на конструктора foo се извиква с посочените аргументи и това се свързва с новосъздадения обект. new foo е еквивалентен на new foo(), т.е. ако не е указан списък с аргументи, foo се извиква без аргументи.

Обектът, върнат от функцията конструктор, става резултат от целия нов израз. Ако функцията на конструктора не връща изрично обект, вместо това се използва обектът, създаден в стъпка 1. (Обикновено конструкторите не връщат стойност, но могат да изберат да го направят, ако искат да заменят нормалния процес на създаване на обект.)

Когато казах, че това е нормална функция, пропуснах едно нещо: намерението на разработчика. Обикновено дефинирате функции, които да бъдат извиквани като конструктори (т.е. с new) или не. В първия случай най-често използвате аргументите, за да инициализирате полетата на екземпляра (използвайки this.name = ...) и често след това добавяте функции към прототипа (както направихте), така че те да станат достъпни за всички екземпляри. И за да стане ясно намерението ви, обичайно е името на вашия конструктор да започва с главна буква.

person Denys Séguret    schedule 14.03.2014
comment
Освен това по конвенция функцията конструктор се изписва с главни букви. - person Davin Tryon; 14.03.2014
comment
Което означава, че функция, предназначена да се използва като функция на конструктор, обикновено първоначално е ограничена. - person T.J. Crowder; 14.03.2014
comment
@DavinTryon Зависи. Изписвам моите конструктори с главни букви, но това не е универсална конвенция. Погледнете например примерите на страницата на MDN, към която свързах. - person Denys Séguret; 14.03.2014

Нека вземем пример, за да разберем раждането на конструкторите в Javascript. Да предположим, че сте помолени да създадете обект на служител и той трябва да има 4 свойства firstName, lastName, gender и designation. Добре! ти каза, че няма проблем.

var employee1={};
employee1.firstName="Anoop";
employee1.lastName="Rai";
employee1.gender="M";
employee1.designation="Software Engineer";

По-горе е най-простият начин, първо сте създали празен обект и след това сте асоциирали всичките 4 свойства към обекта (разбира се, можете също да създадете същото чрез inline). Ами ако бъдете помолени отново да създадете друг обект на служител със същите свойства.

var employee2={};
employee1.firstName="Ram";
employee1.lastName="Kumar";
employee1.gender="M";
employee1.designation="Associate Software Engineer";

Изглежда, че изобщо няма проблем. Сега какво ще стане, ако бъдете попитани, че има общо 100 служители и току-що сте създали 2 от тях, обикновено трябва да създадете още 98 обекта за служители. Сега няма да създавате обекти като по-горе, тъй като изглежда досадно. Хванах те! нека създадем фабричен метод, който ще се извиква произволен брой пъти и ще създава обекти и след това ще ни го връща. да! пишете веднъж и ще се използва много пъти.

function createEmployeeObject(firstName, lastName, gender, designation){
  var employee={};
  employee.firstName=firstName;
  employee.lastName=lastName;
  employee.gender=gender;
  employee.designation=designation;
  return employee;
} 

var employee3=createEmployeeObject("Harry", "Dsouza", "M", "Project Manager");

Много удобен начин и без дублиращи се кодове. Просто извикайте функцията createEmployeeObject с вашите аргументи и в замяна получавате вашия обект. Ами ако имаме няколко вида обекти, да речем отдел. Тогава също ще имаме функция, която ще създаде обект на отдел и ще го върне.

И така, какво е общото в тези видове функции. То е:-

  1. създаване на празен обект

    var myObj={};

  2. връщащ обект след попълването му

    връщане на myObj;

Създаването на празен обект и връщането на обект е обичайно за всички функции, които създават обекти. Javascript създаде пряк път, който ви позволява да не пишете тези редове, когато използвате функция, която създава обекти. Така че тези 2 реда могат да бъдат пропуснати. Начинът да направите това е да използвате конструктори.

Използването на функции за създаване на обекти е доста често срещано в Javascript, така че Javascript предоставя пряк път, който ви позволява да пишете функции за създаване на обекти. Тези специални функции се наричат ​​функции на конструктора. Конструкторите са функции, които ви позволяват да попълвате обекта, който трябва да създадете.

function createEmployeeObject(firstName, lastName, gender, designation){
  this.firstName=firstName;
  this.lastName=lastName;
  this.gender=gender;
  this.designation=designation;
}
var employee4=new createEmployeeObject("Alan", "Marks", "F", "Business Analyst");

Трябва да знаете за тази ключова дума. Тя сочи към текущия обект. Не забравяйте, че във функциите на конструктора Javascript създава празен обект за нас, така че това всъщност сочи само към този обект. Функциите на Javascript Constructor автоматично връщат обекта, след като бъде попълнен. Сега как да кажете на Javascript, че дадена функция се извиква в режим Constructor, това е новата ключова дума, която казва на Javascript да третира функция като функция Constructor. Всеки път, когато имате нужда от обект, използвайте нова ключова дума и след това извикайте функция, след което тази функция подготвя обект за нас и го връща.

Въпреки че Javascript не е базиран на клас, трябва да се погрижите за името на функцията Constructor. не е добре да използвате камилска кутия, използвайте обикновена.

function Employee(firstName, lastName, gender, designation){
  this.firstName=firstName;
  this.lastName=lastName;
  this.gender=gender;
  this.designation=designation;
}
var employee5=new Employee("Mark", "Watson", "M", "DBA");

http://jkoder.com/javascript-constructors-why-it-should-be-used-object-oriented-programming-in-javascript/

person Anoop Rai    schedule 01.09.2016

Dystroy го има.

Друг начин да го кажем е, че една функция става „конструктор“, когато се извиква с оператора new, като конструира нов клас инстанция.

Това е и причината за конвенцията за главни букви в споменатото име на функцията, така че другите разработчици да могат да видят, че това е конструктор, и това попада в текущата конвенция за именуване classes

person Rob Sedgwick    schedule 14.03.2014
comment
*Главни букви (CamelCase) - person Rob Sedgwick; 14.03.2014

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

Така че var catC = new Cat("Fluffy", "White"); създава нов екземпляр на класа на конструктора Cat

person Abhishek Verma    schedule 14.03.2014