节点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);
您将有效地将属性a
和b
附加到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
语句。
它看起来像是从那里调用Server
function的人恢复,而不是作为一个构造函数(即new
)。