javascript - Node 中具有原型(prototype)的单例对象

标签 javascript node.js singleton javascript-objects

我遇到了下面用 Node 编写的代码,我试图理解它。有一个方法 process 附加到原型(prototype)以及对象本身。有什么不同?我了解该方法用于为对象提供单例实例。但是希望进一步解释或引用其工作原理。

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;

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

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

这是构造函数。

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

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

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

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

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

init 方法用于创建 MyObj 原型(prototype)的实例。该实例被分配给singleton对象。 singleton 对象是模块私有(private)的,因此每次调用 MyObj.init 都会操作同一个 singleton 实例,从而有效地覆盖之前存储在其中的对象。这可确保 singleton 对象始终是 MyObj 的实例。

module.exports = MyObj;

构造函数在这里导出。请注意,singleton 对象未导出。

总结

(new MyObj()).process()MyObj.process() 执行相同的函数,因为它们使用相同的 singleton 实例。您可以阅读 NodeJS 中的单例 herehere

关于javascript - Node 中具有原型(prototype)的单例对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35136172/

相关文章:

node.js - 在 WebStorm 中设置 Node.js 环境变量

c++ - 如何创建基类的单个实例

javascript - 在同一个函数中使用函数名会导致无限循环吗?

javascript - 使用不显眼的 javascript 对元素列表进行 Ajax 请求

javascript - 获取街道地址的最佳地理编码是什么?

javascript - 通过字符串到达​​嵌套方法的最佳方法

javascript - Bluebird promise 传播方法返回 TypeError

javascript - 无法在多个文件中拆分 Firebase 函数

java - 测试静态方法类必须更改为单例以进行 JUnit 测试

android - 为什么单例类在 Activity 退出后仍然存在?