JavaScript将变量作为值传递而不是作为引用传递

时间:2011-04-28 19:58:46

标签: javascript variables scope

我认为我的问题很简单,但我找不到一个简单的解决方案。这是一个例子:

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)

那么..从obj1.m1返回“a”需要做什么?

提前致谢

4 个答案:

答案 0 :(得分:6)

您需要将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

答案 1 :(得分:4)

答案 2 :(得分:1)

obj1obj2.m指向相同的对象。你不能拥有obj1.m1 != obj2.m.m1

您可以做的是将obj1的副本分配给obj2.m。请参阅链接Will posted。

答案 3 :(得分:0)

你需要先克隆它。

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>");