节点中具有原型的单例对象

Singleton objects with prototype in node

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

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

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

这是构造函数。

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

使用 MyObj 构造函数创建的每个实例都被赋予一个 process 方法。

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

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

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 here and here

中阅读有关单例的信息