【问题标题】:Singleton objects with prototype in node节点中带有原型的单例对象
【发布时间】:2016-02-01 17:04:07
【问题描述】:

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

【问题讨论】:

  • 看起来您可以选择将其用作单例或构造函数。哪个更适合您的情况。

标签: javascript node.js singleton javascript-objects


【解决方案1】:

我会解释每个代码块:

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 herehere 中的单例

【讨论】:

    猜你喜欢
    • 2020-03-14
    • 2015-09-24
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多