2017-03-02 48 views
0

我想知道在Js中是否存在某种东西来“重新定义var或object”,就像其他语言一样。像一个“别名”JavaScript中属性对象的别名

对于实施例 东西我有一个对象

var obj1 = new Object(); 

这具有的属性attR1和对象2。

obj1.attr1 = 'a'; 
obj1.obj2 = new Object(); 

是否有可能,我有“alias_attr1”和“alias_obj1”和他们都相同的是attR1和obj2的?

感谢

+0

别名?,然后如果你改变原来的别名?,如果这是真的,javascript wirks是这样的,因为它的作用与参考 –

回答

0

如果我没有记错,对象是通过引用传递,但它们指的是同一个对象,如果你不克隆它。原始物不是。所以,如果你具备以下条件:

var obj1 = { 
    "id" : 7 
}; 
var obj2 = { 
    "one" : "a", 
    "two" : "a", 
    "three" : obj1, 
    "four" : obj1 
}; 
console.log(obj2.three === obj2.four) // -- > true 

由于OBJ1是一个对象,你不克隆它,既obj2.three和obj2.four引用相同的对象。然而,obj2.one和object2.two是字符串,并且它们不引用彼此,即使它们具有相同的值。

但它并不止于此,您可以单独覆盖objs。因此,如果您将obj1设置为其他值,obj2.three和obj2.four仍将包含原始obj1。 obj1 = 'test'; - > obj2保持不变。

但是,如果你更新OBJ1而不是覆盖它,无论是直接obj1.id = 8;或间接obj2.three.id = 8;,这些更改将出现在obj2.four:(obj2.four.id === 8) // --> true

所以这是一个有点复杂,我不是最好的解释这一点,但有多个关于它的博客可以在您的最喜欢搜索引擎中找到。

+0

的定义但你创建另一个对象...我引用像'obj2 .three = obj2.one'或'obj2.three = obj2.four'。 –

+0

你也这么做。如果你进入你的代码'obj1.obj3 = obj1.obj2',你为你自己的obj2创建一个'别名'。但是如果你去'obj1.obj3 = new Object()',你可以创建第三个(不同的)对象。所以你可以去'obj1.alias_attr1 = obj1.attr1',但它们将是两个不同的字符串,你可以单独编辑。如果使用'obj1.alias_obj1 = obj1.obj2',那么'obj1.alias_obj1'或'obj1.obj2'中的任何更改都会出现在同一个obj的另一个引用内。但是一旦你覆盖了其中的一个,'obj1.alias_obj1 ='someThingNotObj2Reference',引用就会消失。 – Shilly

+0

谢谢expanation :-D –