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

时间:2014-02-11 23:24:29

标签: javascript arrays object

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”会改变吗?

3 个答案:

答案 0 :(得分:4)

通过该数组实例化表达式创建数组时,运行时系统会将每个对象属性的复制到数组中。如果稍后更改属性的值,它们将单独更改数组元素

JavaScript中没有办法让一个对象的属性“镜像”另一个对象的属性。 (好吧,没有内在的方法;你可以编写代码来实现它。)

答案 1 :(得分: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());

答案 2 :(得分:0)

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

当您按照惯例声明函数时,car1,car2,car3的值将在该范围内进行评估,然后分配给该数组。

当您执行新的Dealership()位时,该数组的值几乎与评估函数时的值相同。你做完

之后
tomsauto.car2 = "Subaru";

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

如果您想了解更多关于如何以及为什么的信息,我建议您阅读更多关于javascript和函数式语言的闭包。