В чем разница между функцией и функцией конструктора в javascript?
на этой автор блога говорит ниже функция конструктор
function Cat(name, color) {
this.name = name;
this.color = color;
}
Cat.prototype.age = 0;
var catC = new Cat("Fluffy", "White");
экземпляров Cat
функция имеет свойство name и color. Это единственное различие между нормальной и конструктор функции ?
4 ответов
функция конструктора является нормальной функцией.
что здесь имеет значение, так это использование new
оператор, который делает контекст (this
) в функции новый экземпляр, таким образом, позволяя ему взять два свойства и возвращает этот новый экземпляр.
без new
оператор, контекст был бы внешним (window
если ваш код находится в глобальной области видимости в свободном режиме, undefined
если в строгом режиме).
то есть, если вы опускаете new
var catC = Cat("Fluffy", "White");
функция "работает" (если вы не в строгом режиме), но у вас есть два разных результата :
-
catC
isundefined
поскольку ваша функция ничего не возвращает -
name
иcolor
теперь свойства внешней области
вся магия, таким образом, находится в новый оператор :
когда код новый foo(...) выполняется, следующее бывает:
создается новый объект, наследуемый от foo.прототип.
в функция конструктора foo вызывается с указанными аргументами и это связано с вновь созданным объектом. новый foo эквивалентен новому foo (), т. е. если список аргументов не указан, foo вызывается без аргументы.
объект, возвращаемый функцией конструктора, становится результат всего нового выражения. Если функция конструктора не явным образом возвращает объект, объект, созданный на шаге 1 используется вместо этого. (Обычно конструкторы не возвращают значение, но они можно сделать это, если они хотят переопределить обычный объект процесс создания.)
когда я сказал, что это нормальная функция I, я опустил одну вещь : намерение разработчика. Обычно вы определяете функции, которые будут вызываться как конструкторы (т. е. с new
) или нет. В первом случае вы чаще всего используете аргументы для инициализации поля экземпляра (используя this.name = ...
), и вы часто следуете, добавляя функции к прототипу (как вы это сделали), чтобы они стали доступными для всех экземпляров. И чтобы сделать ваше намерение ясным, принято называть ваш конструктор, начиная с прописной буквы.
давайте возьмем пример, чтобы понять рождение конструкторов в Javascript. Предположим, вас просят создать объект employee и он должен иметь 4 Свойства firstName, lastName, gender, и обозначение. Хорошо! ты сказал, никаких проблем.
var employee1={};
employee1.firstName="Anoop";
employee1.lastName="Rai";
employee1.gender="M";
employee1.designation="Software Engineer";
выше-самый простой способ, сначала вы создали пустой объект, а затем связали все 4 Свойства с объектом (конечно, вы могли бы также создать то же самое через inline). Что делать, если вас снова попросят создать другой объект employee с теми же свойствами.
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 с вашими аргументами и взамен вы получите свой объект. Что если у нас есть несколько типов объектов, скажем, отдела. Тогда также у нас будет функция, которая создаст объект отдела и вернет его.
Итак, что общего в этих видов функций. Это:-
-
создание пустого объекта
var myObj={};
-
возврат объекта после его заполнения
вернуться 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 создает для нас пустой объект, поэтому это фактически указывает только на этот объект. Контрактной Работе С Разными Компаниями 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");
Dystroy есть.
другой способ сказать это, это функция становится "конструктор", когда он вызывается с помощью new
оператор, строительство новый экземпляр класса.
это также является причиной соглашения о капитализации в имени функции, которое упоминается, так что другие разработчики могут видеть, что это конструктор, и это соответствует текущему соглашению об именовании classes
в объектно-ориентированном программировании конструктор класса-это специальный тип подпрограммы, называемый для создания объекта. Он подготавливает новый объект к использованию, часто принимая аргументы, используемые конструктором для задания требуемых переменных-членов.
Так var catC = new Cat("Fluffy", "White");
создает новый экземпляр класса конструктора Cat