如何使nodejs导出一个静态对象

时间:2015-04-15 12:40:59

标签: node.js

我想知道下面的代码运行正确

a.js:

var obj = {
    name: 'a'
};
module.exports = obj;

b.js

var b = require('./a');

module.exports = b;

c.js

var a = require('./a');

console.log(a); // {name: 'a'}

a.name = 'b';
console.log(require('./a')); // {name: 'b'}
console.log(require('./b')); // {name: 'b'}

所以,我可以从外面更改模块导出

如果我将a.js加入a.json

a.json

{
    "name": "a"
}

我得到了相同的结果

如何导出模块无法修改或覆盖

之外的表单

1 个答案:

答案 0 :(得分:4)

您可以冻结对象:

// in order for people to not add properties through the prototype
var o = Object.create(null);
o.name = 'a';
Object.freeze(o); // no one can change properties
Object.seal(o); // no one can add properties;
module.exports = o;

如果你使用的是现代版本的nodejs(阅读io.js),你也可以使用代理:

var o = {name: 'a'};
var p = new Proxy(o, {
   set: function(obj, prop, value) {
       // unlike the freeze approach, this also throws in loose mode
       throw new TypeError("Can't set anything on this object");
   }
});
return p;
那说,你在防守谁?为什么人们会改变另一个模块中的对象?