2014-01-22 75 views
0

最近,我一直在使用JavaScript进行更多工作,我不明白为什么会发生以下情况。我没有提供数百行代码,而是创建了重现问题的场景。JavaScript - 将多个变量设置为对象属性不会改变基础值

问题:

设置多个变量的一个对象的属性不会改变对象的潜在价值。


实施例:

DEMO

在以下示例中,我已经创建了两个类:

//company 
function Company(name, subsidiary) { 
    var self = this; 
    self.name = name; 
    self.subsidiary = subsidiary; 
}; 

//subsidiary 
function Subsidiary(name, type) { 
    var self = this; 
    self.information = { 
     name: name, 
     type: type, 
     type2: type 
    }; 
} 

现在,我执行以下操作:

  • 创建一个新的公司,并在构造函数中添加新的子公司:
  • 定义与/子公司性质
//new company 
var company = new Company(
    'Company 1', [ 
     new Subsidiary('Subsidiary 1', 'small') 
    ]), 
    subsid = company.subsidiary[0], //get first subsidiary 
    info = subsid.information, //get information 
    type = info.type; //get type 

下面的代码是其他变量问题所在:

当我尝试更改变量类型时,公司内部值不变...

//does not work 
type = 
    type === 'small' ? 
    'large' : 
    'small'; 

然而,如果我使用信息并引用属性类型info.type),该值的变化...

//works 
info.type2 = 
    info.type2 === 'small' ? 
    'large' : 
    'small'; 

我假定由于每个可变从另一个导出,类型将相当于company.subsidiary[0].information.type,但似乎并非如此。

我错过了什么吗?

任何援助将不胜感激。谢谢!

回答

1

你有一个名为“type”的属性的对象。您获取该属性的值,并将该值的拷贝放在名为“type”的局部变量中。对局部变量的后续更改不会影响对象属性值。

你的假设:

我假定由于每个可变从另一个导出,类型将相当于company.subsidiary [0] .information.type

是不正确的。JavaScript赋值运算符表示值副本的操作。因此,

var type = info.type; 

意味着对象属性的值应该被复制作为变量的值。此后,变量和对象属性之间绝对没有特殊关系。

然后,在这里:

var info = subsid.information; 

你建立了一个名为“信息”与“信息”属性的值的副本变量。这是什么价值?这是一个参考对象。这就是为什么后续更新实际上会更改原始对象中实际属性的值。

没有直接的方法可以使简单的局部变量成为JavaScript中对象属性的别名。

+0

谢谢您花时间回答!但我仍然有点困惑。变量'info'不会是'company.subsidiary [0] .information'的副本吗?为什么要改变'info.type'改变公司内的价值? – Dom

+0

因为你明确地**更新了对象属性的值。我会补充一点答案。 – Pointy

+0

非常感谢您花时间解释这一点!你在解释究竟发生了什么时做了一件了不起的工作!再次感谢,我会尽快接受你的回答。 – Dom