nodejs cookie中间件源代码中的“Cookie的这个实例”

我试图通过查看源代码来了解cookie中间件的工作方式。 这个中间件将取代弃用的cookieParser()。 https://github.com/jed/cookies/blob/master/lib/cookies.js

在解释第一句话时需要一些帮助:

... function Cookies(request, response, keys) { if (!(this instanceof Cookies)) return new Cookies(request, response, keys) ... } ... 
  1. “!(这个Cookies的实例)”是做什么的? 是否检查“this”是函数本身?
  2. 这个代码的目的是什么?

非常感谢!

它使new关键字可选和这些等效:

 var cookies = new Cookies(); var cookies = Cookies(); 

在javascript中,如果对象是通过执行new F() (或new G() ,其中GF的原型链中)构造的,则对象将是函数F的instanceof

当调用new F() ,函数F被调用,并且在函数体内, this指的是一个新的对象,它是F一个实例。 但是,如果您只需调用FF() ,则将其设置为全局对象(浏览器中的window和node.js中的global )。

有问题的线路正在进行testing,以查看是否使用new关键字(如new Cookies(...)调用Cookies函数,在这种情况下, this将是一个对象,该对象是Cookies一个实例, Cookies this instanceof Cookies将评估为true ),或者它是否被调用(例如Cookies(...) ,在这种情况下, this将是一些不是Cookies实例的对象)。 在第二种情况下,函数被调用new并返回。

这可以让API的使用者调用带有或不带有new关键字的Cookies ,并仍然获取作为Cookies实例的对象。 没有这个检查,调用没有new Cookies将导致意想不到的结果。

另请参阅:

这使您可以使用或不使用new关键字来创buildCookie的实例。 this是指实例。 如果你调用的函数没有new关键字, this将是全局对象,而不是一个新的实例。