无法修改nodejs模块值

cannot modify nodejs module value

本文关键字:模块 nodejs 修改      更新时间:2023-09-26

我想用一些默认值初始化一个模块,然后根据需要进行更改。为此,我有一个包含_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控制台中运行您的示例。