无法修改nodejs模块值
cannot modify nodejs module value
我想用一些默认值初始化一个模块,然后根据需要进行更改。为此,我有一个包含_state
值的模块/单例。我公开了一个setter方法来更新该值。但是,setter不会更新_state
成员变量。代码如下:
var StateObject = function () {
var _state = { a: 1 };
return {
state : _state,
setState : function (s) {
_state = s;
}
};
}();
modules.export = StateObject;
以及调用功能:
var SO = require('./state-object');
console.log(SO.state.a); // prints 1
SO.setState({a: 2});
console.log(SO.state.a); // still prints 1
有人能解释一下是什么原因造成的吗?如果有解决办法的话?
这样的解决方案的潜在缺陷是,如果某段代码在本地存储SO.state
并引用它。如果发生这种情况,并且稍后调用setState()
,那么引用将不会在该代码中更新。这只是当你替换整个州时需要注意的事情,而不仅仅是州中的个人价值观。
这里的问题与参考文献有关。执行StateObject()
时,state
变量存储对_state
的初始引用。然后,当调用setState()
时,将覆盖_state
,但state
仍保留上一个引用。
你可以试试这样的东西:
modules.export = {
state: { a: 1 },
setState: function(v) {
this.state = v;
}
};
正如mscdex所提到的,问题在于引用没有更新。
在我看来,主要问题实际上是你的逻辑:如果你没有getter,为什么要有setter?
var SO = function () {
var _state = { a: 1 };
return {
getState : function () {
return _state;
},
setState : function (s) {
_state = s;
}
};
}();
console.log(SO.getState().a); // prints 1
SO.setState({a: 2});
console.log(SO.getState().a); // prints 2
这是有效的,因为它还返回了对最新集合对象的引用。这实际上与节点或模块无关,您可以在浏览器的JavaScript控制台中运行您的示例。
相关文章:
- 导出模块 NodeJS 时出现问题
- 如何从NodeJS中的模块返回数组
- nodeJS中的uglify js“;找不到模块“”;
- 如何解压缩NodeJS请求's模块gzip响应体
- Nodejs模块函数返回未定义的,而不是异步的
- Nodejs模块文件和concat
- 将路由处理程序委托给NodeJS+Express中的其他模块
- NodeJS请求模块-http上的body.IncomingMessage
- NodeJS:一个全局EventEmitter或每个模块它'他自己的
- NodeJS 是否重用已经加载的模块并共享其值?
- 如何使用nodejs步行模块将目录遍历到第一级
- 将 NodeJS 模块范围变量作为对象访问
- 从导出的模块返回变量,并在另一个文件(NodeJS)中使用它
- 为什么“exports”在nodejs模块中引用与“this”相同的对象
- 对NodeJS模块开发的怀疑
- NodeJS Semaphore模块:它是如何工作的
- 全局安装的NodeJS npm模块不执行节点的主/bin JavaScript文件
- 如何在nodejs中模块化代码
- 带有参数的模块 NodeJS
- 使用请求模块nodejs下载文件时需要filename