Когда вы делаете это:
var express = require('express');
Экспресс-модуль возвращает вам заводскую функцию .Фабричная функция - это обычная функция, которую вы вызываете как обычная функция, и когда вы ее вызываете, она создает и возвращает объект.
Это не конструктор напрямую (именно поэтому вы не используете new
на нем).Это был дизайнерский выбор создателей библиотеки Express.Они решили не подвергать обычный конструктор объекту app
напрямую.
Вы можете увидеть экспортированную функцию express
в коде справа здесь, в исходном хранилище .Внутренне они называют это createApplication
.Если вы посмотрите на код, вы увидите, что это на самом деле не простой объект.Это миксин (объект, который объединяет функции и данные экземпляров нескольких объектов), и они решили реализовать создание этого миксин-объекта с использованием фабричной функции.
FYI, вот часть кода (это createApplication
функция - это то, что возвращается после загрузки модуля express
):
exports = module.exports = createApplication;
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;
}