1

我有嵌套对象和原型设计的问题。在以下示例中,我正在创建对象“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 是不同的变量,它们不应该完全分开吗?

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

4

2 回答 2

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
};
于 2013-04-05T13:34:04.750 回答
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
};
于 2013-04-05T13:34:13.257 回答