Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法修改nodejs模块值_Javascript_Node.js - Fatal编程技术网

Javascript 无法修改nodejs模块值

Javascript 无法修改nodejs模块值,javascript,node.js,Javascript,Node.js,我想用一些默认值初始化一个模块,并在以后需要时更改它们。为此,我有一个模块/单例,其中包含一个\u state值。我已经公开了一个setter方法来更新该值。但是,setter不会更新\u state成员变量。代码如下所示: var StateObject = function () { var _state = { a: 1 }; return { state : _state, setState : function (s) {

我想用一些默认值初始化一个模块,并在以后需要时更改它们。为此,我有一个模块/单例,其中包含一个
\u state
值。我已经公开了一个setter方法来更新该值。但是,setter不会更新
\u state
成员变量。代码如下所示:

var StateObject = function () {
    var _state = { a: 1 };
    return {
       state    : _state,
       setState : function (s) {
          _state = s;
       }
    };
}();
modules.export = StateObject;
modules.export = {
  state: { a: 1 },
  setState: function(v) {
    this.state = v;
  }
};
以及调用函数:

var SO = require('./state-object');
console.log(SO.state.a);  // prints 1
SO.setState({a: 2});
console.log(SO.state.a);  // still prints 1

有人能解释一下是什么导致了这种情况,以及是否有解决办法吗?

像这样的解决方案的潜在陷阱是,如果某段代码存储了
,那么就在本地声明
,并引用它。如果发生这种情况,并且您稍后调用
setState()
,则该段代码中的引用将不会更新。这只是在替换整个状态时需要注意的事项,而不仅仅是替换状态中的单个值

这里的问题与参考文献有关。执行
StateObject()
时,
state
变量存储对
\u state
的初始引用。然后,当调用
setState()
时,覆盖
\u state
,但
state
仍保留前一个引用

您可以尝试以下方法:

var StateObject = function () {
    var _state = { a: 1 };
    return {
       state    : _state,
       setState : function (s) {
          _state = s;
       }
    };
}();
modules.export = StateObject;
modules.export = {
  state: { a: 1 },
  setState: function(v) {
    this.state = v;
  }
};

这样的解决方案的潜在陷阱是,如果某段代码在本地存储
SO.state
,并引用它。如果发生这种情况,并且您稍后调用
setState()
,则该段代码中的引用将不会更新。这只是在替换整个状态时需要注意的事项,而不仅仅是替换状态中的单个值

这里的问题与参考文献有关。执行
StateObject()
时,
state
变量存储对
\u state
的初始引用。然后,当调用
setState()
时,覆盖
\u state
,但
state
仍保留前一个引用

您可以尝试以下方法:

var StateObject = function () {
    var _state = { a: 1 };
    return {
       state    : _state,
       setState : function (s) {
          _state = s;
       }
    };
}();
modules.export = StateObject;
modules.export = {
  state: { a: 1 },
  setState: function(v) {
    this.state = v;
  }
};

正如mscdex所提到的,问题在于引用没有被更新

在我看来,主要的问题实际上是你的逻辑:如果你没有一个能手,为什么要有一个二传手

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控制台中运行您的示例。

好吧,问题在于引用没有更新,正如mscdex所提到的

在我看来,主要的问题实际上是你的逻辑:如果你没有一个能手,为什么要有一个二传手

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控制台中运行示例。

谢谢!特别是指出前面的陷阱。简而言之,直截了当,我现在更明白了。谢谢!特别是指出前面的陷阱。简而言之,直截了当,我现在更明白了。你的观点很好。getter意味着要修改更多的代码。也许我会这么做,但我仍然想理解为什么它不起作用——因此我提出这个问题的理由。感谢您指出它不是特定于节点的。您的观点很好。getter意味着要修改更多的代码。也许我会这么做,但我仍然想理解为什么它不起作用——因此我提出这个问题的理由。感谢您指出它不是特定于节点的。