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意味着要修改更多的代码。也许我会这么做,但我仍然想理解为什么它不起作用——因此我提出这个问题的理由。感谢您指出它不是特定于节点的。