为什么嵌套对象数组中的变量不会改变?

3
function Dealership = function(){
this.car1="Honda";
this.car2="Chevy";
this.car3="Toyota";
this.carList=[this.car1,this.car2,this.car3];
};

var tomsauto = new Dealership();
tomsauto.car2="Subaru";
console.log(tomsauto.carList); //returns honda chevy toyota

我对数组的处理方式感到困惑。它是静态的,仅保留实例化时的变量值,还是当我改变tom.car1时,"this.car1"会跟着改变?


2
在您的情况下,carList 是由值填充而不是引用。 - Teemu
3个回答

4
当您通过数组实例化表达式创建数组时,运行时系统会将每个对象属性的复制到数组中。如果稍后更改属性的值,则它们将独立于数组元素而更改。
在JavaScript中没有办法使一个对象的属性“镜像”另一个对象的属性。(好吧,没有固有的方法;您可以编写代码来完成这个任务。)

2
如 Teemu 所说:您的 carList 被填充了值,而不是引用。
一个简单的解决方法是将其更改为函数 getCarList:
var Dealership = function () {
    this.car1 = "Honda";
    this.car2 = "Chevy";
    this.car3 = "Toyota";
    this.getCarList = function() {
        return [this.car1, this.car2, this.car3];
        }
};

var tomsauto = new Dealership();
tomsauto.car2 = "Subaru";
console.log(tomsauto.getCarList());

谢谢。一个函数完美地工作了。我没有意识到值没有被重新评估。 - justicepsych

0

我认为你遇到这个问题是因为 JavaScript 中闭包的工作方式。

当你像你所做的那样声明函数时,car1、car2、car3 的值在该范围内进行评估,然后被分配给数组。

当你执行 new Dealership() 时,该数组的值基本上设置为函数评估时的值。在执行之后,如果你对数组中的值进行更改,它们将不会影响新创建的 Dealership 实例。

tomsauto.car2 = "Subaru";

car2的值将会改变,但是数组不会因为这些值没有被重新评估。

如果你想了解更多关于这个问题的如何和为什么,我建议你阅读更多有关JavaScript和函数式语言中闭包的知识。


2
这个特定问题实际上并不涉及闭包语义。它们不是变量,而是对象属性。 - Pointy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接