因此,我在学习ExpressJS时注意到了大多数教程/等。我看到开始了
var express = require('express');
.
.
.
var app = express();
将对express
函数的调用输出存储到app
到底发生了什么?为什么new
关键字不存在,对我来说似乎是实例化?
答案 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;
}