单例对象与节点中的原型
我遇到下面的代码写在节点,我想了解。 有一个方法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的单身人士