我想知道自从使用全局字段 cacheObj 以来是否使用它的好习惯 我需要解析数据并在其他模块之间共享,任何模块都可以获取任何属性,但只有调用此解析器的第一个模块负责提供要解析的数据(我只需要解析一次并共享属性)不同的模块)
此代码来自其他SO帖子,我想使用它
var Parser = require('myParser'),
_ = require('lodash');
var cacheObj; // <-- singleton, will hold value and will not be reinitialized on myParser function call
function myParser(data) {
if (!(this instanceof myParser)) return new myParser(data);
if (!_.isEmpty(cacheObj)) {
this.parsedData = cacheObj;
} else {
this.parsedData = Parser.parse(data);
cacheObj = this.parsedData;
}
}
myParser.prototype = {
//remove `this.cacheObj`
getPropOne: function () {
return this.parsedData.propOne;
},
getPropTwo: function () {
return this.parsedData.propTwo;
}
};
module.exports = myParser;
答案 0 :(得分:1)
它看起来像Context Object模式,用于维护状态和共享信息。有些人认为这是一种不好的做法,在分享图层之间的对象时更喜欢Singleton,但如果你的情况是套房(在同一个模块中) - 我的建议是使用它。
更新
您不应该通过您的layes使用ContextObject的主要原因是它将所有子系统绑定在一起(一个对象引用其他所有内容)。虽然Singleton不仅仅用于创建对象,它也可以作为可以由相应子系统加载的接入点的服务。使Singleton代表每个服务访问点允许协作组件/模块的无缝垂直集成。简单的代码示例:
的Singleton:
// returns the "global" time
var time = Clock.getInstance().getTime();
上下文对象:
// allows different timezones to coexist within one application
var time = context.getTimezoneOffset().getTime();