【问题标题】: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 的某个地方引用同一个对象。一点魔法都没有。