繁体   English   中英

Node.js _http_server.js的服务器功能的第一行混乱

[英]Node.js _http_server.js' Server function's first line confusion

我正在阅读node.js的http模块的源代码。 _http_server.js它具有一个功能

function Server(requestListener) {
  if (!(this instanceof Server)) return new Server(requestListener);
  net.Server.call(this, { allowHalfOpen: true });

  if (requestListener) {
    this.on('request', requestListener);
  }
  ...
}

if (!(this instanceof Server)) return new Server(requestListener);我不明白第一行if (!(this instanceof Server)) return new Server(requestListener);

在其他文件中,例如函数http.createServer ,此函数称为return new Server(requestListener) 因为new创建的对象永远不是Server函数的实例。 会不会是无限递归循环?


下面的答案很好。 但这是对我的困惑的补充:

通过调用new Foo() ,将创建一个新object 然后object[[prototype]]将链接到Foo.prototype 只有在this之后,它将被绑定到object并且Foo将被执行。

因为instanceof检查Fooprototype是否在object的原型链中,所以如果Servernew调用,则新创建的object将是Server的实例。

这是一个常见的习惯用法,允许实例化类而不必使用new 换句话说,它允许这两个:

let instance = new Server();
let instance = Server();

第一行旨在捕获第二种实例化方法(这只是一个常规函数调用)。 在这种情况下, this并不是指新的实例,所以this instanceof Server将是错误的。

发生这种情况时,将使用new Server()创建一个实例。 将会再次调用相同的函数,但是由于使用new因此this变量现在将指向新创建的实例,并且绕过检查(因此它不会创建递归调用)。

在其他文件中,例如函数http.createServer ,此函数称为return new Server(requestListener) 因为new创建的对象永远不是Server函数的实例。

它是Server 的实例。

使用new创建元素时,创建的对象是引用为new的函数的实例,因此当http.createServer调用return new Server(requestListener)new元素就是 Server的实例。

这种方法不可能产生循环,因为当不是实例时,它将以这种方式创建一个新实例:

  • 我被叫了,让我们检查一下我是否是我的一个实例
  • 不,创建我的新实例
  • 我被叫了,让我们检查一下我是否是我的一个实例
  • 是的,我是我的一个实例。 继续

这样做是为了创建Server的新实例,而无需调用new

var serverinstance = Server(rqlistener);
var serverinstance2 = new Server(rqlistener);

由于Server函数的内部代码,两者都是Server的实例。

在我看来,我不喜欢这类骇客。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM