"this instanceof Cookies" 在 nodejs 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. "!(这个Cookie实例)"做什么?它是否在检查"this"是函数本身
  2. 此代码的用途是什么

非常感谢!

它使new关键字是可选的,并且这些关键字等价:

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

在javascript中,如果对象是通过执行new F()(或new G(),其中GF的原型链中)构造的,则该对象将是函数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将是全局对象,而不是新实例。

最新更新