Javascript 嵌套对象实例

Javascript 嵌套对象实例,javascript,Javascript,我对嵌套对象和原型设计有问题。 在下面的示例中,我创建了对象“o”的两个实例 我的问题是为什么t1.test.val2==t2.test.val2,其中t1和t2是不同的变量, 他们不应该完全分开吗 如何修复该代码,使所有对象和变量内部分离?当定义新对象时,会复制原型,但原型中的对象不会被深度复制;它们是通过引用复制的。因此,每个新的o实例都有一个对原型的完全相同的成员对象的复制引用 相反,在构造函数中创建test对象,以便每个实例都有自己的副本: var o = function(){

我对嵌套对象和原型设计有问题。 在下面的示例中,我创建了对象“o”的两个实例

我的问题是为什么t1.test.val2==t2.test.val2,其中t1和t2是不同的变量, 他们不应该完全分开吗


如何修复该代码,使所有对象和变量内部分离?

当定义新对象时,会复制原型,但原型中的对象不会被深度复制;它们是通过引用复制的。因此,每个新的
o
实例都有一个对原型的完全相同的成员对象的复制引用

相反,在构造函数中创建
test
对象,以便每个实例都有自己的副本:

var o = function(){
    this.test = {
        val2 : 1
    }
};

o.prototype = {
    val : 1   // this is fine, since primitive values aren't copied by reference
};

这是因为您正在修改共享对象(即原型)的属性。您的代码基本上与以下代码相同:

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

谢谢,还有其他方法可以实现同样的解决方案吗?但不向构造函数插入代码?@Cezary代码必须进入构造函数,如果您不想共享原型的非原始属性。如果出于某种原因,您真的不想在原型中放入代码,那么您可以在原型中只使用基本值(即非对象值)。仅供参考:这个问题似乎与的重复,但另一个问题基于错误的前提(也就是说,OP不应该看到他看到的行为,除非他在实际代码中做了一些非常错误的事情,不包括在问题的不完整代码示例中)。
var o = function(){
    this.val = 1;
    this.test = {
        val2 : 1
    };
    // test is no longer shared, exists per instance
};