【问题标题】:JavaScript passing variable as value and not as referenceJavaScript 将变量作为值而不是引用传递
【发布时间】:2011-08-15 00:26:00
【问题描述】:

我认为我的问题很简单,但我找不到简单的解决方案。示例如下:

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”?

提前致谢

【问题讨论】:

标签: javascript variables scope


【解决方案1】:

你需要先克隆它。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 请注意,我特别 /not/ 将 clone 函数附加到 Object.prototype,因为这通常是一个非常糟糕的主意。此外,这是一个非常简单的克隆函数实现;要获得更完整的内容,请查看 jQuery.extend 的实现。
    【解决方案3】:

    obj1obj2.m 指向 same 对象。你不能有obj1.m1 != obj2.m.m1

    您可以将obj1 的副本分配给obj2.m。请参阅将发布的链接。

    【讨论】:

      【解决方案4】:

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-24
      • 2015-05-16
      • 2023-03-10
      • 1970-01-01
      • 2011-05-25
      • 1970-01-01
      • 2018-10-31
      • 1970-01-01
      相关资源
      最近更新 更多