Каковы все различия между функцией и функцией-конструктором в 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 :

При выполнении кода 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 свойства: имя, фамилия, пол и назначение. Что ж! ты сказал нет проблем.

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

Выше приведен самый простой способ: сначала вы создали пустой объект, а затем связали с объектом все 4 свойства (конечно, вы могли бы также создать то же самое с помощью встроенного метода). Что делать, если вас снова попросят создать другой объект сотрудника с теми же свойствами.

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. создание пустого объекта

    вар myObj={};

  2. возврат объекта после его заполнения

    вернуть мойОбъект;

Создание пустого объекта и возврат объекта являются общими для всех функций, создающих объекты. 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 создает для нас пустой объект, так что это фактически указывает только на этот объект. Функции Javscript Construtor автоматически возвращают объект после его заполнения. Теперь, как сообщить Javascript, что функция вызывается в режиме конструктора, это новое ключевое слово, которое указывает Javascript рассматривать функцию как функцию конструктора. Каждый раз, когда вам нужен объект, используйте новое ключевое слово, а затем вызывайте функцию, а затем эта функция подготавливает для нас объект и возвращает его.

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

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-объектно-ориентированное-программирование-в-javascript/

person Anoop Rai    schedule 01.09.2016

У Дистроя есть.

Другими словами, функция становится "конструктором", когда она вызывается с помощью оператора 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