通过“app = new Express()”和“app = express()”初始化快递应用程序之间是否存在差异

时间:2015-11-18 20:50:56

标签: javascript express

我一直看到快递应用程序被初始化为:

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

但今天我偶然发现了一个新运算符的例子:

var Express = require('express')
var app = new Express()

有什么不同吗?

来源:https://github.com/erikras/react-redux-universal-hot-example/blob/0d7c49318a8ed78bdef4022b9f0adc4bfb04bdba/src/server.js#L25

1 个答案:

答案 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的结果。