从Nodejs中的模块导出变量的优雅方法

时间:2015-10-30 06:27:01

标签: javascript node.js module

我希望在Node.js中的一个模块的参数初始化后导出一个变量。

现在,我有三种选择。

选项1 :直接与exports

// moduletest.js

exports.init = function(v, w) {
    // actually, the value of a and b could be initialized by other functions.
    // here is one example, simply assign them with v and w just for test
    exports.a = v;
    exports.b = w;
}

变量ab可以在模块外使用。

// app.js
require('./moduletest').init(3, 1);

var ff = require('./moduletest');

console.log(ff.a);
console.log(ff.b);

选项2 :在对象中使用var get方法。

var MyObject = {
    init: function(a, b) {
        this._a_ = a;
        this._b_ = b;
    },

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

exports.mod = {
    valA: MyObject.getA,
    init: MyObject.init
}

可以通过_a_方法访问变量getA

选项3 :通过函数原型中的一个get方法。

var Test = function (a, b){
    this._a_ = a;
    this._b_ = b;
};

Test.prototype.getA = function()
{
    return this._a_;
}

exports.mod = Test;

这里有两个问题:

  • 哪一个更优雅的方式呢?
  • 如果以上三个选项都不是更好,那还有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

根据您对问题的评论,可能的方法如下。你的主要问题是你实际上没有隐藏数据,因此让用户修改它们。

module.exports = function (_a, _b) {
    return function() {
        var obj = { };
        Object.defineProperty(obj, 'a', {
            get: function () { return _a; }
        });
        Object.defineProperty(obj, 'b', {
            get: function () { return _b; }
        });
    };
}

您可以按照以下方式使用它:

var factory = require('file_above')(your_a, your_b);
// code
var instance = factory();
// you cannot modify a or b on instance!!

使用函数的bind方法等可以完成类似的操作。请记住,有很多可能的解决方案,其中没有一个是正确的解决方案,而几乎所有解决方案都是有效的。

据我所知,无论如何,你上面发布的那些都有一些小问题,当然所有这些问题都很好。