Пример функции конструктора
function User(name) {
this.name = name;
this.isAdmin = false;
}
let user = new User("Jack");
new
создает прототип объекта на User.prototype
и вызывает User
с созданным объектом в качестве значения this
.
new
обрабатывает выражение аргумента для своего операнда как необязательное:
let user = new User;
заставит new
вызвать User
без аргументов.
new
возвращает созданный им объект, , если конструктор не возвращает значение объекта , которое возвращается взамен.Это крайний случай, который по большей части можно игнорировать.
Плюсы и минусы
Объекты, созданные функциями конструктора, наследуют свойства от свойства prototype
конструктора,и верните true, используя оператор instanceOf
в функции конструктора.
Приведенное выше поведение может завершиться ошибкой, если вы динамически измените значение свойства prototype
конструктора после того, как конструктор уже используется. Это редко , и его нельзя изменить, если конструктор был создан с помощью ключевого слова class
.
Функции конструктора могут быть расширены с помощью ключевого слова extends
.
Функции конструктора не могут возвращать null
в качестве значения ошибки.Так как это не объектный тип данных, он игнорируется new
.
Пример функции фабрики
function User(name, age) {
return {
name,
age,
}
};
let user = User("Tom", 23);
Здесь фабричная функция вызывается без new
.Функция полностью отвечает за прямое или косвенное использование своих аргументов и типа возвращаемого объекта.В этом примере он возвращает простой [объект объекта] с некоторыми свойствами, установленными из аргументов.
"за" и "против"
легко скрывает сложности реализации создания объекта от вызывающей стороны.Это особенно полезно для функций собственного кода в браузере.
Заводская функция не всегда должна возвращать объекты одного типа и даже может возвращать null
в качестве индикатора ошибки.
InВ простых случаях фабричные функции могут быть простыми по структуре и значению.
Возвращаемые объекты обычно не наследуются от свойства prototype
фабричной функции и возвращают false
из instanceOf factoryFunction
.
Заводская функция не может быть безопасно расширена с помощью ключевого слова extends
, поскольку расширенные объекты наследуются от свойства prototype
фабричных функций, а не от свойства prototype
конструктора, используемого функцией фабрики.