Думаю основная причина почему кажется что это должно работать — это непонимание разницы между функцией в 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 уже есть классы, так что лучше использовать их.
Вывод: методы объекта и функции это не одно и то же.