partyzanx
@partyzanx

Почему в конструкторе не могу написать так?

В коде...
let AllConstructors = {
Man: function(name, login, age) {
if (!new.target) return new this.Man(name, login, age);
this.name = name;
this.login = login;
this.age = age;
this.isAdmin = false; 
let secret = 24;
},
};
 
let user123 = AllConstructors.Man('Vasia','Zeus',23);
let user124 = AllConstructors.Man('Mitya','Poseidon',25);
console.log(user123);
console.log(user124);


Почему я не могу строку Man: function(name, login, age) { написать как Man (name, login, age) { ?

  • Вопрос задан
  • 349 просмотров
Решения вопроса 1
e-vyushin
@e-vyushin
Frontend engineer
Думаю основная причина почему кажется что это должно работать — это непонимание разницы между функцией в JS и методом объекта. Это не одно и то же, несмотря на то что оба варианта можно вызвать подписав скобочки () в конце :) Да, вызывать можно и функцию и метод объекта, а вот создавать экземпляры методов нельзя.

В указанном Вами примере внутри функции Man вызывается new this.Man. Это означает, что создаётся экземпляр Man, а значит сам Man должен иметь конструктор (грубо говоря быть классом).

Функции в JS имеют конструктор, а методы объектов не имеют. Функции и методы объектов это не одно и то же. Рассмотрим такой пример:

const obj = {
   Man() {}
}

в данном случае Man() это просто метод объекта. У него нет своего конструктора. Т. е. нельзя создать его экземпляры через new. Но можно его вызвать:

const obj = {
   Man() {}
}
obj.Man();

это корректный вариант.

Но создавать экземпляры нельзя. Например:

const obj = {
   Man() {}
}
new obj.Man(); // Будет ошибка. TypeError: obj.Man is not a constructor

А вот экземпляры функции можно создавать. Например:

const obj = {
   Man: function() {}
}
new obj.Man(); // Всё ок

для того чтобы создать экземпляр функции не обязательно конечно чтобы она была внутри объекта. Можно и так:

const Man = function() {}
new Man(); // Всё ок

При желании можно поискать инфу на тему почему можно создавать экземпляры функции. Говоря вкратце, раньше в JS не было классов, по-этому наследование было реализовано через прототип функции. Это немного нелепо конечно, но в JS можно создавать экземпляры функции как если бы функция была классом. Сегодня в JS уже есть классы, так что лучше использовать их.

Вывод: методы объекта и функции это не одно и то же.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
Потому что у вас обычный объект, а не класс.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы