我正试图通过查看源代码来了解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)
...
} ...
- "!(这个Cookie实例)"做什么?它是否在检查"this"是函数本身
- 此代码的用途是什么
非常感谢!
它使new
关键字是可选的,并且这些关键字等价:
var cookies = new Cookies();
var cookies = Cookies();
在javascript中,如果对象是通过执行new F()
(或new G()
,其中G
在F
的原型链中)构造的,则该对象将是函数F的instanceof
。
当调用new F()
时,会调用函数F
,并且在函数体中,this
引用一个新对象,该对象是F
的实例。然而,如果像F()
一样简单地调用F
,则this
被设置为全局对象(浏览器中的window
和node.js中的CCD15)
有问题的行是测试函数Cookies
是使用new
关键字调用的(如new Cookies(...)
,在这种情况下this
将是Cookies
的实例,this instanceof Cookies
将计算为true
),还是在没有Cookies(...)
的情况下调用的(例如CCD_23,在这种情况下this
将是不是Cookies
的实例的某个对象)。在第二种情况下,使用new
调用函数并返回。
这使得API的使用者在使用或不使用new
关键字的情况下调用Cookies
,并且仍然获取作为Cookies
实例的对象。如果没有此检查,在没有new
的情况下调用Cookies
将导致意外的结果。
另请参阅:
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof
- https://stackoverflow.com/a/383503/711902
这允许您创建带有或不带有new
关键字的Cookie实例。this
是指该实例。如果调用不带new
关键字的函数,则this
将是全局对象,而不是新实例。