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