编写ExpressJS应用程序时,为什么不使用“ new”关键字?

时间:2019-04-30 00:35:34

标签: javascript node.js function express

因此,我在学习ExpressJS时注意到了大多数教程/等。我看到开始了

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

将对express函数的调用输出存储到app到底发生了什么?为什么new关键字不存在,对我来说似乎是实例化?

2 个答案:

答案 0 :(得分:2)

这是Express团队设计Express.JS的方式-它是另一种构造函数。一种构造函数使用this

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

另一种返回对象-这是Express所使用的类型:

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

这是另一种方式,这是Express设计框架的方式。

答案 1 :(得分:2)

执行此操作时:

var express = require('express');

快速模块向您返回工厂功能。工厂函数是一个常规函数,就像常规函数一样调用,调用它时,它会创建并返回一个对象。

它不是直接构造函数(这就是为什么不在其上使用new的原因)。这是Express库的创建者的设计选择。他们选择不直接向app对象公开常规构造函数。

您可以在代码权here in the source repository中看到导出的express函数。在内部,他们称其为createApplication。如果看一下代码,您会发现它实际上不是一个普通的对象。这是一个mixin(将多个对象的功能和实例数据组合在一起的对象),他们选择使用工厂函数来实现该mixin对象的创建。

仅供参考,这是代码的一部分(此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;
}