![](/img/trans.png)
[英]_http_server.js - no request('events') yet .emit() && .on() how?
[英]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
检查Foo
的prototype
是否在object
的原型链中,所以如果Server
被new
调用,则新创建的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.