JavaScript передает переменную как значение, а не как ссылку - PullRequest
2 голосов
/ 28 апреля 2011

Думаю, моя проблема проста, но я не смог найти простое решение. Вот пример:

var obj1 = {
    m1:"a",
    m2:"b" 
};

var obj2 = {
    m:obj1
};


obj2.m.m1 = "c";


document.write(obj2.m.m1+"<br>"); //output: c

document.write(obj1.m1+"<br>"); // output: c ( I wanted to be a)

Итак ... что мне нужно сделать, чтобы вернуть "a" из obj1.m1?

Заранее спасибо

Ответы [ 4 ]

6 голосов
/ 29 апреля 2011

Вам необходимо установить obj2.m для клона obj1, а не obj1. Например:

function clone(obj) {
    var result = {};
    for (var key in obj) {
        result[key] = obj[key];
    }
    return result;
}

var obj2 = {
    m: clone(obj1)
};

obj2.m.m1 = "c";  // does not affect obj1.m1
4 голосов
/ 29 апреля 2011

Это может быть полезно:

http://my.opera.com/GreyWyvern/blog/show.dml/1725165

1 голос
/ 29 апреля 2011

obj1 и obj2.m указывают на тот же объект .Вы не можете иметь obj1.m1 != obj2.m.m1

Что вы можете сделать, это назначить копию obj1 для obj2.m.Смотрите ссылку Будет опубликовано.

0 голосов
/ 29 апреля 2011

сначала нужно его клонировать.

Object.prototype.clone = function() {
  var newObj = (this instanceof Array) ? [] : {};
  for (i in this) {
    if (i == 'clone') continue;
    if (this[i] && typeof this[i] == "object") {
      newObj[i] = this[i].clone();
    } else newObj[i] = this[i]
  } return newObj;
};

var obj1={    m1:"a",    m2:"b" };
var obj2={    m: {}};
obj2.m = obj1.clone();
obj2.m.m1="c";
document.write(obj2.m.m1+"<br>"); 
document.write(obj1.m1+"<br>"); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...