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

В этом блоге автор говорит, что ниже функция является функцией конструктора:

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

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

Экземпляры функции Cat имеют свойство name и color. Это единственная разница между нормальной и конструкторской функцией?

Ответ 1

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

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

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

То есть, если вы опустите new

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

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

  • catC undefined, поскольку ваша функция ничего не возвращает
  • name и color теперь являются свойствами внешней области

Вся магия, таким образом, находится в новом операторе:

При выполнении кода new foo (...) происходит следующее:

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

функция-конструктор foo вызывается с указанными аргументами и это связано с вновь созданным объектом. новый foo эквивалентен новому foo(), то есть если список аргументов не указан, foo вызывается без Аргументы.

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

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

Ответ 2

Давайте рассмотрим пример, чтобы понять рождение конструкторов в Javascript. Предположим, вас попросили создать объект сотрудника, и он должен иметь 4 свойства firstName, lastName, пола и назначения. Что ж! Вы сказали, что нет проблем.

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

Хотя 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/

Ответ 3

У Dystroy есть это.

Другой способ сказать, что функция становится "конструктором", когда она вызывается с помощью new Operator, создавая новый экземпляр класса.

Это также является основанием для соглашения о капитализации в названии функции, которое упоминается, так что другие разработчики могут видеть, что он является конструктором, и это входит в текущее соглашение об именах classes

Ответ 4

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

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