this.myObj = myObj会存储引用还是复制/快照?

时间:2014-02-05 16:15:30

标签: javascript json reference duplicates

如果myObj是一个javascript对象,那么

this.myObj = myObj

创建该对象目前的样子的副本/快照,还是存储对实际对象的引用?

我遇到的问题似乎是同一个对象的双重设置,这就是为什么我开始怀疑我是否实际上在不想要的时候维护副本...

3 个答案:

答案 0 :(得分: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 }

答案 1 :(得分:2)

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

想想就好......

var newObj = { };

现在发生的事情是,在HEAP上的某个地方形成/创建新对象,并在newObj变量中引用该对象。我们去的时候

newObj.foo = newObj

我们只是在HEAP上的某个地方引用相同的对象。根本没有魔法。

答案 2 :(得分:0)

参考,当然:

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;
    }
}