我一直看到快递应用程序被初始化为:
var express = require('express')
var app = express()
但今天我偶然发现了一个新运算符的例子:
var Express = require('express')
var app = new Express()
有什么不同吗?
答案 0 :(得分:0)
我认为存在一个微妙的差异,但在这种情况下并没有产生太多(任何?)差异。
使用Node.js
' require
语句,您最终得到的是模块分配给module.exports
的对象。这可能是任何东西,即使只是一个简单的值,但它也可能是一个函数。
因此,假设您在myModule.js
中有以下模块:
function complexOperation() {
// blah blah
}
module.exports = complexOperation;
当你这样做时:
var myModule = require("myModule.js");
最终将myModule
设置为complexOperation
,您可以像任何常规功能一样调用它。直截了当。但请注意,在此处执行new complexOperation()
之类的操作并不一定有意义 - 所有这些都取决于complexOperation
是什么。
在Express.js
的情况下,返回的对象本身就是一个函数,即createApplication
(在此文件中定义:https://github.com/strongloop/express/blob/master/lib/express.js)。因此require('express')
返回一个函数,该函数被分配给express
,然后在下一行运行。因此app
最终会得到函数createApplication
的执行结果。
第二个变体(忽略了一个评论者指出,你错误引用该源文件的事实)使用new
关键字。当你这样做时:
var a = new Something();
Something
应该是一个函数 - 一个构造函数。这句话的作用是:
Something()
并将this
设置为新对象Something()
(还有更多内容正在设置对象的原型。完整的解释:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new)。
所以在上面的例子中,语句var app = new Express()
创建一个新对象,调用Express()
并设置this
来引用新创建的对象,然后返回结果。 / p>
在Express.js
的情况下,因为导出的东西本身就是一个函数,所以实现了大致相同的结果。创建了一个新对象,createApplication
相应地设置this
,然后app
获得createApplication
的结果。