Я действительно запутался в заявлении var app = express(). Я просматривал старую публикацию об этом (в stackoverflow), и один парень сказал, что var app = express () похож на var app = new express (). У меня есть 2 файла js для имитации этого, но я не могу понять, как 'new express ()' дает желаемый результат.
//play.js
var express = require('./express');
var app = new express();
// this will call createApplication function as app is referencing to it.
console.info(app); // "app"
а также
//express.js
function createApplication(){
var app = 'app';
return app;
}
module.exports = createApplication;
Когда я использую var app = new express (), результат будет createApplication {}.
а не app



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


express - это заводская функция, а не функция-конструктор. Ее следует вызывать как обычную функцию, а не использовать с new.
Вы можете увидеть его код прямо здесь: https://github.com/expressjs/express/blob/master/lib/express.js#L37
function createApplication() {
var app = function(req, res, next) {
app.handle(req, res, next);
};
mixin(app, EventEmitter.prototype, false);
mixin(app, proto, false);
// expose the prototype that will get set on requests
app.request = Object.create(req, {
app: { configurable: true, enumerable: true, writable: true, value: app }
})
// expose the prototype that will get set on responses
app.response = Object.create(res, {
app: { configurable: true, enumerable: true, writable: true, value: app }
})
app.init();
return app;
}
Именно эта функция createApplication() экспортируется из require('./express');, поэтому, когда вы вызываете express(), вы просто вызываете эту функцию createApplication().
Это может сработать, выполнив new express(), потому что функция createApplication() также будет вызываться (как конструктор) в этом случае и поскольку она возвращает объект app, который будет результатом new express(), но это расточительный способ сделать это, потому что Оператор new создаст объект, который затем будет выброшен.
@RohanSharma - Почему настаивают на использовании new express()? Это НЕ то, как он был разработан для использования. Вероятно, это сработает, если вы сделаете const app = new express(), но он НЕ предназначен для использования.
хорошо, я просто пытаюсь понять логику, я не очень разбираюсь в программировании, я понимаю, что мы экспортируем функцию и используем функцию, когда мы используем var = express (), я думаю, я буду пытаться ударить и попытаться научиться в чем дело
@RohanSharma - Когда вы вызываете express(), он вызывает экспортированную функцию createApplication(), показанную в моем ответе. Выполнение этой функции создает другую функцию (которая является объектом в Javascript), назначает кучу свойств этому объекту функции, дает ему прототип, а затем возвращает этот новый объект. Я не знаю, почему Express делает это именно так, а не использует обычный конструктор с new. Это просто другой, более ручной способ создания нового объекта с прототипом и некоторыми методами.
выразить в стороне, если я просто использую эти фиктивные файлы js, когда я использую var app = new express (), что я сделал, чтобы получить результат
createApplication {}, и если я хочу получить результат как простоapp, как мне это сделать (с использованием нового ключевого слова).