我想知道下面的代码运行正确
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"
}
我得到了相同的结果
如何导出模块无法修改或覆盖
之外的表单答案 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;
那说,你在防守谁?为什么人们会改变另一个模块中的对象?