Почему при написании приложения ExpressJS ключевое слово «new» не используется? - PullRequest
0 голосов
/ 30 апреля 2019

Итак, я заметил, что, изучая ExpressJS, большинство учебников и т. Д. Я вижу начало

var express = require('express');
.
.
.
var app = express();

что на самом деле происходит с сохранением результата вызова функции express в app? Почему здесь нет ключевого слова new, так как оно выглядит для меня экземпляром?

Ответы [ 2 ]

2 голосов
/ 30 апреля 2019

Когда вы делаете это:

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;
}
2 голосов
/ 30 апреля 2019

Так команда Express разработала Express.JS - это конструктор другого рода.Один вид конструктора использует this:

function NewItem(prop) {
    this.prop = prop;
}

Другой тип возвращает объект - это тот тип, который использует Express:

function newItem() {
    return {
        prop: "defaultProp"
    }
}

Это просто другой способ, и это какЭкспресс разработал свои рамки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...