JavaScript: сохранить объект как фиксированное значение? - PullRequest
3 голосов
/ 13 марта 2011

Я заметил такое поведение при написании моего JavaScript, и я не смог понять, почему:

Ниже приведен код для воспроизведения рассматриваемого поведения.

var o1 = {
  num: 1
}
var o2 = o1;
o2.num = 2;
alert(o1.num);

Ожидаемый результат: Браузер предупреждает 1, потому что я изменил только свойство объекта o2 , а не объекта o1 .

Фактический результат: Браузер предупреждает 2, потому что кажется, что o1 равно o2 .

Я не совсем уверен, что происходит. Как я могу исправить код, чтобы он предупреждал 1, а не 2 (при условии, что o1 не изменился)?

Большое спасибо заранее.

Ответы [ 3 ]

5 голосов
/ 13 марта 2011

Поскольку обе переменные ссылаются на один и тот же объект. Объекты не клонируются / копируются при присвоении переменных. Вы должны сделать это сами .

В этом случае JavaScript ведет себя так же, как и любой (большинство) других ОО-языков.

3 голосов
/ 13 марта 2011

При написании var o2 = o1; вы делаете o1 и o2 две ссылки на один и тот же объект .Вам нужно клонировать объект o1 и сохранять клонированную копию в o2.Поиск объектов клонирования в JavaScript.

2 голосов
/ 13 марта 2011

Поскольку вы устанавливаете объекты в одну и ту же контрольную точку. Вам нужно клонировать объект. Вот фрагмент кода из http://www.thespanner.co.uk/2008/04/10/javascript-cloning-objects/, который позволяет клонировать объекты с прототипированием.

Object.prototype.clone = function() {
  return eval(uneval(this));
}
alert("test".clone());
alert((3).clone());
alert(clone.clone());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...