Javascript 节点中带有原型的单例对象
我遇到了下面用node编写的代码,我正在努力理解这些代码。原型和对象本身都有一个方法Javascript 节点中带有原型的单例对象,javascript,node.js,singleton,javascript-objects,Javascript,Node.js,Singleton,Javascript Objects,我遇到了下面用node编写的代码,我正在努力理解这些代码。原型和对象本身都有一个方法过程。有什么区别?我理解这种方法是用来为对象创建单例实例的。然而,我想进一步解释或参考这是如何工作的 var singleton; var MyObj = function(opts) {//code} MyObj.prototype = { process: function() {//code} } MyObj.process = function process() { singleton.pr
过程。有什么区别?我理解这种方法是用来为对象创建单例实例的。然而,我想进一步解释或参考这是如何工作的
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
对象
对于此模块是私有的,对MyObj.process
的每次调用都会执行同一singleton
对象的.process
方法
MyObj.init = function init(opts) {
singleton = new MyObj(opts);
}
init
方法用于创建MyObj
原型的实例。此实例被分配给单例
对象。singleton
对象是模块的私有对象,因此对MyObj.init
的每次调用都会操作相同的singleton
实例,有效地覆盖以前存储在其中的对象。这确保了singleton
对象始终是MyObj
的实例
module.exports = MyObj;
构造函数在这里导出。请注意,singleton
对象未导出
总之
(新的MyObj()).process()
和MyObj.process()
执行相同的函数,因为它们使用相同的singleton
实例。您可以在NodeJS中阅读关于单例的内容,看起来您可以选择将其用作单例或构造函数。哪一个对你的情况更有效。