我基本上有一个对象,但是这个对象只会在用户输入后填充。但是其他类也在使用这个对象。但是在用真实对象填充对象之后,它不会在其他类中更新。
示例:
var x = {
text: null
}
var y = {
text: x.text
}
x.text = 'trlalala';
console.log(y.text);
console.log(x.text);
但是当我运行它时,y.text将打印出null。但价值应该已经更新。我的一个朋友告诉我这是因为y.text复制了x.text的结构而不是引用。被困了一会儿。 :\
任何意见都将不胜感激,谢谢!
答案 0 :(得分:4)
text: x.text
查看x.text
(对null
的引用)的值,并将y.text
设置为该值。
当您说x.text = 'trlalala'
时,您更改了x.text
的值(因此它是对不可变字符串'trlalala'
的引用),但y.text
的值仍然是参考null
。
如果要共享这样的数据,您需要一个可以引用的中间对象。 (从那时起你将处理对象的引用)
var x = {
data: { text: null }
};
var y = {
data: x.data
};
x.data.text = 'trlalala';
console.log(y.data.text);
console.log(x.data.text);
答案 1 :(得分:2)
定义y
时,您要定义属性(即常量值)而不是方法。并且您将text
的值定义为x.text
- 这意味着在定义时间,x.text
的值被查找并用作(常量)价值y.text
。
如果您希望x.text
中的更改反映在y
中,那么您可以将y.text
定义为功能,以便查看此值每次调用该方法时按需按需。这可能看起来像这样:
var y = {
text: function() {
return x.text;
}
};
现在每当您更新x.text
时,对y.text()
的后续调用都会产生新值。
答案 2 :(得分:1)
在JavaScript中,字符串是primitive value,无法直接引用,但只是像你的情况一样被复制。
所以你的朋友是对的:使用命令text: x.text
只复制x.text
的当前值,这里是'null。
x.text
的重新分配对y.text
没有影响,因为这只是一个副本,没有参考!