我想在使用 Node.js
中的一个模块的参数初始化后导出一个变量。
现在,我有三个选择。
选项 1:直接导出
// 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;
}
变量a
和b
可以在模块外使用。
// 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:通过函数原型(prototype)中的一个 get
方法。
var Test = function (a, b){
this._a_ = a;
this._b_ = b;
};
Test.prototype.getA = function()
{
return this._a_;
}
exports.mod = Test;
这里我有两个问题:
- 哪一种方法更优雅?
- 如果以上三种方案都不好,还有更好的方法吗?
最佳答案
根据对您问题的评论,一种可能的方法如下。您的主要问题是您实际上没有隐藏数据,从而让用户可以修改它们。
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
方法等来完成。请记住,有很多可能的解决方案,但没有一个是正确的,但几乎所有解决方案都是有效的。
据我所知,无论如何,您上面发布的那些都存在一些小问题,当然,尽管它们都工作正常。
关于javascript - Nodejs 中从模块导出变量的优雅方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33429957/