解析并共享模块中的obj资源

时间:2015-09-01 08:05:47

标签: javascript node.js design-patterns

我想知道自从使用全局字段 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;

1 个答案:

答案 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();