【问题标题】:will this.myObj = myObj store a reference or a copy/snapshot?this.myObj = myObj 会存储引用还是副本/快照?
【发布时间】:2014-03-02 04:35:33
【问题描述】:

如果 myObj 是一个 javascript 对象,将

this.myObj = myObj

创建该对象当前外观的副本/快照,还是存储对实际对象的引用?

我在处理同一个对象的双组时遇到了麻烦,这就是为什么我开始怀疑我是否真的在维护副本,而我不想这样做......

【问题讨论】:

标签: javascript json reference duplicates


【解决方案1】:

肯定是参考:

var foo = function () {};
var foo_instance = new foo();
var bar = {
    foo: foo_instance
};
console.log(foo_instance === bar.foo);    // true

如果要克隆对象,有两种选择:

jQuery:

var foo = function () {};
var foo_instance = new foo();

var foo_instance_clone = new foo();
$.extend(foo_instance_clone, foo_instance);

纯 JavaScript:

var foo = function () {};
var foo_instance = new foo();

var foo_instance_clone = new foo();
for (var key in foo_instance) {
    if (foo_instance.hasOwnProperty(key)) {
        foo_instance_clone[key] = foo_instance;
    }
}

【讨论】:

    【解决方案2】:

    它是对对象的引用。一个对象有两种“寻址”它的方式。

    function Cls(obj) {
      this.myObj = obj;
    }
    
    var foo = { bar : 1 }
    var x = new Cls(foo);
    
    foo.bar = 2;
    console.log(x.myObj) // { bar : 2 }
    

    【讨论】:

      【解决方案3】:

      您只是在分配对对象的引用。毕竟,您只是在处理 ECMAscript 中的 references。没有像“实际对象”这样的东西可以在内存中处理或克隆它。好吧,您可以克隆它,但这只会在您获得 reference 的 HEAP 上创建另一个对象。

      这样想……

      var newObj = { };
      

      现在发生的情况是,新对象在 HEAP 的某处形成/创建,并且您在 newObj 变量中引用了该对象。当我们去喜欢

      newObj.foo = newObj
      

      我们只是在 HEAP 的某个地方引用同一个对象。一点魔法都没有。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-10
        • 1970-01-01
        • 1970-01-01
        • 2012-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多