如果myObj是一个javascript对象,那么
this.myObj = myObj
创建该对象目前的样子的副本/快照,还是存储对实际对象的引用?
我遇到的问题似乎是同一个对象的双重设置,这就是为什么我开始怀疑我是否实际上在不想要的时候维护副本...
答案 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;
}
}