使用来自不同模块的对象

时间:2015-08-30 08:55:46

标签: javascript node.js module require

我有以下代码,它是解析对象,并且像下面一样提供getters,这是有效的,问题是我想从不同的模块访问这个对象并避免再次解析,怎么能我这样做没有定义全局var?

var ymlParser = require('yamljs');

function ymlParse(src) {
    if (!(this instanceof ymlParse)) return new ymlParse(src);
    this.data = ymlParser.parse(src);
}

ymlParse.prototype = {
    getA: function () {
        return this.data.default_A;
    },

    getB: function () {
        return this.data._B;
    }
};

module.exports = ymlParse;

假设我想从模块B访问模块A和B中的A,当我调用getB时,如何在不调用getB的情况下再次发送 src ,这样我就可以这样做了通过src ...

2 个答案:

答案 0 :(得分:0)

您可以在ymlParse课程中进行缓存(它的设计类似于课程,不是吗?)。 只需存储src个对象和解析结果。如果ymlParse将使用缓存的src执行,则只返回存储的结果而不进行解析。

尝试更改您的代码:

var ymlParser = require('yamljs');

function ymlParse(src) {
    if (!(this instanceof ymlParse)) return new ymlParse(src);
    if (this.cache[src]) {
        this.data = this.cache[src];
    } else {
        this.data = ymlParser.parse(src);
        this.cache[src] = this.data;
    }
}

ymlParse.prototype = {
    cache: {},

    getA: function () {
        return this.data.default_A;
    },

    getB: function () {
        return this.data._B;
    }
};

module.exports = ymlParse;

请注意,我没有使用this.data对象的深层副本。如果它不是只读的,可能会导致一些问题。

答案 1 :(得分:0)

您可以使用Memoization模式 - http://addyosmani.com/blog/faster-javascript-memoization/。在其他答案中实施的一个问题不是散布这些论点。所以你应该有这样的东西:

var ymlParser = require('yamljs');

function ymlParse(src) {
  var hash = JSON.stringify(src);

  if (!(this instanceof ymlParse)) return new ymlParse(src);
  if (this.cache[hash]) {
    this.data = this.cache[hash];
  } else {
    this.data = ymlParser.parse(src);
    this.cache[hash] = this.data;
  }
}

ymlParse.prototype = {
  cache: {},

  getA: function () {
    return this.data.default_A;
  },

  getB: function () {
    return this.data._B;
  }
};

module.exports = ymlParse;

仔细研究JSON.stringify方法。您必须在此处实现散列算法,该算法将与src数据关联作为唯一标识符。通常是JSON.stringify,但你可以使用自己的。

或功能风格的另一种解决方案:

var _ = require('lodash');
var ymlParser = require('yamljs');

function ymlParse(src) {
  var result = ymlParser.parse(src);

  return {
    getA: function() {
      return result.default_A;
    },
    getB: function() {
      return result._B;
    }
  };
}

module.exports = _.memoize(ymlParse);

用法相同,你只需像往常一样调用导出函数。