单例对象与节点中的原型

时间:2016-02-01 17:04:08

标签: javascript node.js singleton javascript-objects

我遇到了下面编写的节点代码,我正在努力理解。有一个方法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;

1 个答案:

答案 0 :(得分:1)

我将解释每个代码块:

var singleton;

此变量在模块中声明但未导出。这意味着它对模块是私有的,并且存在于闭包中。

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

这是构造函数。

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

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

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

此方法存在于原型本身上。调用时,它会执行process对象的singleton方法。因为singleton对象 对于此模块是私有的,每次调用MyObj.process都会执行相同.process对象的singleton方法。

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

init方法用于创建MyObj原型的实例。此实例已分配给singleton对象。 singleton对象对模块是私有的,因此每次调用MyObj.init都会操纵相同的singleton实例,从而有效地覆盖先前存储在其中的对象。这可确保singleton对象始终是MyObj的实例。

module.exports = MyObj;

构造函数在此处导出。请注意,不会导出singleton对象。

总结

(new MyObj()).process()MyObj.process()执行相同的功能,因为它们使用相同的singleton实例。您可以在NodeJS herehere

中阅读有关单身人士的信息