嵌套对象实例

时间:2013-04-05 13:29:20

标签: javascript

我遇到嵌套对象和原型设计的问题。 在下面的示例中,我创建了对象" 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是不同的变量, 不应该完全分开吗?

如何修复该代码以使所有对象和变量分开?

2 个答案:

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