节点net.js服务器()

我检查了net.js中的createServer()函数:

 exports.createServer = function() { return new Server(arguments[0], arguments[1]); }; 

我检查了net.js中的Server()函数的源代码,发现

 function Server(/* [ options, ] listener */) { if (!(this instanceof Server)) return new Server(arguments[0], arguments[1]); events.EventEmitter.call(this); var self = this; // ...... } 

当我们调用createServer()函数时,该函数将调用new Server() 。 而在Server()函数中,由于this不是Server的一个实例,它将再次调用new Server() 。 基于我的理解,新的Server()函数会一直调用新的Server(),因此会陷入无限循环。 有人能解释我在这里错了吗?

如果Quentin是正确的,那么if语句永远不会是真的,因为已经在createServer()函数中调用了new Server()

这是JavaScript中非常常见的模式。 采取以下措施:

 function MyInst(a, b) { this.a = a; this.b = b; } var inst = MyInst(a, b); 

您将有效地将属性ab附加到global对象。 所以相反,你有一个条件来检查调用是否是一个正确的构造函数调用:

 function MyInst(a, b) { if (!(this instanceof MyInst)) return new MyInst(a, b); this.a = a; this.b = b; } // Now I can be lazy and not use "new" var inst0 = MyInst(a, b); // Or I can still use it properly var inst1 = new MyInst(a, b); 

同样的事情正在net.Server() 。 从根本上保护人们不受自身的影响,并始终确保对象上下文是自身的一个实例。

return new Server语句之前有一个if语句。

它看起来像是从那里调用Serverfunction的人恢复,而不是作为一个构造函数(即new )。