单例对象与节点中的原型

我遇到下面的代码写在节点,我想了解。 有一个方法process附加到原型以及对象本身。 有什么不同? 我明白这个方法是用来为对象提供单例实例的。 但是,想要进一步解释或参考这是如何工作的。

 var singleton; var MyObj = function(opts) {//code} MyObj.prototype = { process: function() {//code} } MyObj.process = function process() { singleton.process(); } MyObj.init = function init(opts) { singleton = new MyObj(opts); } module.exports = MyObj; 

我会解释每个代码块:

 var singleton; 

这个variables是在模块中声明的,但是没有被导出。 这意味着它对模块是私有的并且存在于闭包中。

 var MyObj = function(opts) { /* code */ } 

这是构造函数。

 MyObj.prototype = { process: function() {//code} } 

每个使用MyObj构造函数创build的实例都有一个process方法。

 MyObj.process = function process() { singleton.process(); } 

这个方法存在于原型本身。 当被调用时,它执行singleton对象的process方法。 由于singleton对象是该模块的专用对象,因此每次调用MyObj.process执行同一个singleton对象的MyObj.process方法。

 MyObj.init = function init(opts) { singleton = new MyObj(opts); } 

init方法用于创buildMyObj原型的一个实例。 这个实例被分配给singleton对象。 singleton对象是模块的私有对象,所以每次调用MyObj.init操作同一个singleton实例,从而有效地覆盖之前存储在其中的对象。 这确保了singleton对象始终是MyObj一个实例。

 module.exports = MyObj; 

这里的构造函数被导出。 请注意, singleton对象不会被导出。

综上所述

(new MyObj()).process()MyObj.process()执行相同的function,因为它们使用相同的singleton实例。 您可以在这里和这里阅读有关NodeJS的单身人士