合并Javascript对象和所有引用指向他们

时间:2015-02-26 12:05:39

标签: javascript underscore.js pass-by-reference

在javascript中,变量引用objects are passed a "copy of the reference"。我正在努力解决这个概念,因为它涉及合并两个对象,以及对这些对象的引用的影响。尝试使用下划线扩展,请使用以下(coffeescript)代码:

a = {
    id: 1
    type: "cat"
    name: "Angry"
}
b = {
    id: 1
    type: "dog"
    owner: "Bill"
}

c = a
d = c
e = b


_.extend(a, b)

b = a

d.home = "Nashville"

console.log(a) //Object {id: 1, type: "dog", name: "Angry", owner: "Bill", home: "Nashville"} 
console.log(b) //Object {id: 1, type: "dog", name: "Angry", owner: "Bill", home: "Nashville"}
console.log(c) //Object {id: 1, type: "dog", name: "Angry", owner: "Bill", home: "Nashville"}
console.log(d) //Object {id: 1, type: "dog", name: "Angry", owner: "Bill", home: "Nashville"}
console.log(e) //Object {id: 1, type: "dog", owner: "Bill"}

正如我们所看到的,下划线并没有“合并”。对象。相反,发生的事情是下划线设置了由b引用的a引用的对象的属性。稍后,当我们将b所持有的引用替换为指向a引用的对象时,e继续保留对b最初引用的对象的引用。这是因为e未分配对b的引用,而是b所持引用的副本。同样,d包含引用,而不是c,而是a引用的对象。

我想找到一种真正合并两个对象的方法,以便对两个对象的所有引用都指向一个目标。这在Javascript中是可行的,还是由于Javascript的对象传递结构而导致我无法做到这一点?

1 个答案:

答案 0 :(得分:3)

  

我想找到一种真正合并两个对象的方法,以便对两个对象的所有引用都指向一个目标。这在Javascript中是可行的,还是由于Javascript的对象传递结构而导致我无法做到这一点?

如果不更改参考文件,即在访问所有变量并使用新参考值重新分配它们时,这是不可能的 - 在您的情况下,e = b就像您b = a一样

要获得预期的结果,您可能希望_.extend(a, b); _.extend(b, a);使它们具有相同的属性 - 但它们会保留两个不同的对象。