我遇到嵌套对象和原型设计的问题。 在下面的示例中,我创建了对象" o"
的2个实例var o = function(){};
o.prototype = {
val : 1,
test : {
val2 : 1
}
};
var t1 = new o();
var t2 = new o();
t1.val = 5;
t2.val = 20;
t1.test.val2 = 5;
t2.test.val2 = 10;
console.log(t1.val) //5
console.log(t2.val) //20
console.log(t1.test.val2) //10
console.log(t2.test.val2) //10
我的问题是为什么t1.test.val2 === t2.test.val2,其中t1和t2是不同的变量, 不应该完全分开吗?
如何修复该代码以使所有对象和变量分开?
答案 0 :(得分:1)
定义新对象时,会复制原型,但原型中的对象未被深度复制;它们通过引用复制。因此,每个新的o
实例都有一个复制的引用到原型的完全相同的成员对象。
相反,在构造函数中创建test
对象,以便每个实例都有自己的副本:
var o = function(){
this.test = {
val2 : 1
}
};
o.prototype = {
val : 1 // this is fine, since primitive values aren't copied by reference
};
答案 1 :(得分:1)
这是因为您正在修改共享对象(即原型)的属性。您的代码与以下内容基本相同:
var val = 1;
var test = {
val2 : 1
};
var t1 = {
val: val,
test: test
};
var t1 = {
val: val,
test: test
};
t1.val = 5; // changing property
t2.val = 20; // changing property
t1.test.val2 = 5; // changing property of shared object
t2.test.val2 = 10; // changing property of shared object
要解决这个问题,不要使用原型,即
var o = function(){
this.val = 1;
this.test = {
val2 : 1
};
// test is no longer shared, exists per instance
};