2015-11-28 2 views
1

Как известно, объекты в JavaScript копируются по ссылке, а не по значению. Но нижеприведенный код, который я написал, работает не так, как ожидалось. Может быть, я не знаю правильного поведения. Пожалуйста, дайте представление и возможное решение, чтобы избежать подобных случаев.Скопировать по ссылке

Мой код:

var a = { 
    obj:{u:1,v:2,w:3}, 
    setobj:function(objj){ 
     this.obj = objj 
    } 
}; 

var b = a; 
var m = b.obj 
console.log(m); 

Он печатает - {u:1,v:2,w:3},

тогдашний

var c = a; 
c.setobj({x:4,y:5}); 
console.log(c.obj); //prints {x:4,y:5} 
console.log(a.obj); //prints {x:4,y:5} 
console.log(b.obj); //prints {x:4,y:5} 

но:

console.log(m); //prints {u:1,v:2,w:3} 

Я ожидал м содержать ссылку b.obj, где b содержит ссылку a. Последний работает, но первая (ссылка m) не работает. Пожалуйста, дайте представление об этом и скажите мне, что мне не хватает. Это очень глупое мое предположение или есть что-то, чего я не знаю?

+0

Да, ваше предположение неверно. m - ссылка на объект, который был сохранен в b.obj. Вы переполнили эту ссылку позже, но она не позволит магическим образом указать m на новый объект. Кроме того, «копировать по ссылке» на самом деле не имеет большого смысла. – flq

ответ

6

Объект не скопирован, но ссылка к объекту is копировано. Сами ссылки являются значениями.

Итак, когда вы пишете m = b.obj, m баллов напрямую к объекту 1,2,3. m не является ссылкой на b.obj, но ссылка на (кстати) тот же объект, на который ссылается b.obj.
Таким образом, m и b.obj являются обоими (теперь несвязанными) ссылками на один и тот же объект 1,2,3.

Затем, когда вы перезаписываете b.obj, эта ссылка изменяется на объект 4,5, но m по-прежнему является ссылкой на исходный объект.

2

{u:1,v:2,w:3} является автономным объектом и имеет ссылочный адрес. при назначении obj:{u:1,v:2,w:3} , obj адресный адрес {u: 1, v: 2, w: 3} адрес. , когда вы сделаете c.setobj({x:4,y:5});, новый адрес будет присвоен obj.

ваш код равен:

var anotherObject= {u:1,v:2,w:3} 
var a = { 
obj:anotherObject, 
setobj:function(objj){ 
    this.obj = objj 
    } 
}; 
Смежные вопросы