Javascript属性镜像到另一个实例

Javascript属性镜像到另一个实例,javascript,properties,overriding,Javascript,Properties,Overriding,假设我们在Javascript中有如下内容: obj1.prop1.prop1_1.prop1_1_1 = 3; 调用此函数时,我希望将值3设置在同一个树位置,但设置在obj2中,就像调用: obj2.prop1.prop1_1.prop1_1_1 = 3; 所有这些都有一个约束,即obj2最初不使用prop1.prop1_1.prop1_1_1填充 我想第一步应该是重写obj1.prop1,使其返回obj2.prop1。但是,需要将obj2.prop1分配给与obj1.prop1相同类型的

假设我们在Javascript中有如下内容:

obj1.prop1.prop1_1.prop1_1_1 = 3;
调用此函数时,我希望将值3设置在同一个树位置,但设置在obj2中,就像调用:

obj2.prop1.prop1_1.prop1_1_1 = 3;
所有这些都有一个约束,即obj2最初不使用prop1.prop1_1.prop1_1_1填充


我想第一步应该是重写obj1.prop1,使其返回obj2.prop1。但是,需要将obj2.prop1分配给与obj1.prop1相同类型的实例。我们怎么做呢?

如果我理解正确,
obj1.prop1.prop1_1
obj2.prop1.prop1_1
不是同一个对象,您希望在前者上设置
prop1_1
属性,以便在后者上也设置相同的属性

从ES5开始,这是可能的,但我不认为我会推荐它。:-)

下面是一个示例,其中
obj2.prop1.prop1_1.prop1_1_1
上的getter从
obj1
获取值:

var obj1 = {
    prop1: {
        prop1_1: {
            prop1_1_1: 42
        }
    }
};
var obj2 = {
    prop1: {
        prop1_1: {
        }
    }
};
Object.defineProperty(obj2.prop1.prop1_1, "prop1_1_1", {
    get: function() {
        return obj1.prop1.prop1_1.prop1_1_1;
    }
});
console.log("obj1.prop1.prop1_1.prop1_1_1 = " + obj1.prop1.prop1_1.prop1_1_1); // 42
console.log("obj2.prop1.prop1_1.prop1_1_1 = " + obj2.prop1.prop1_1.prop1_1_1); // 42
obj1.prop1.prop1_1.prop1_1_1 = 3;
console.log("obj1.prop1.prop1_1.prop1_1_1 = " + obj1.prop1.prop1_1.prop1_1_1); // 3
console.log("obj2.prop1.prop1_1.prop1_1_1 = " + obj2.prop1.prop1_1.prop1_1_1); // 3

(查看控制台)|

如果T.J.Crowder的假设正确,您可以执行以下操作:

obj1.prop1.prop1_1.prop1_1_1= [3]


obj2.prop1.prop1_1.prop1_1_1= obj1.prop1.prop1_1.prop1_1_1
现在,如果更改obj2.prop1.prop1_1.prop1_1[0],obj1.prop1.prop1_1.prop1_1[0]也将更改

这是因为当您将其定义为[3]时,它实际上创建了一个数组对象并将其引用(也称为指针)存储在obj1.prop1.prop1_1.prop1_1_1_1中,因此obj1.prop1.prop1_1.prop1_1_1和obj2.prop1.prop1_1.prop1_1_1将对同一数组具有相同的引用。内存中只有一个数组,但有两个对它的引用,更改一个数组也会更改另一个数组

如果使用obj1.prop1.prop1_1.prop1_1_1=3,则在本例中,prop1_1_1是一个基本体,而不是对对象的引用。所以如果你说

obj1.prop1.prop1_1.prop1_1_1= obj2.prop1.prop1_1.prop1_1_1

它实际上会将值3复制到另一个变量,使其在内存中的两个不同位置保存值3,更改一个不会更改另一个

只是为了澄清,ES5意味着ECMAScript 5,它是用于实现的Javascript标准。最新的浏览器支持它,但最明显的是IE8和旧版本不支持它。请参阅:有关支持“属性初始值设定项中的Setter”的浏览器列表。不过,我的答案在那些浏览器上也能用。谢谢T.J。这部分解决了我的问题。不过,我需要完全不填充obj2,因此需要动态地在obj2中创建prop1和prop1_1,并能够随后解析obj2的属性树。通过这种方式,我可以从obj2了解对obj1所做的所有修改。但我想这是不可能的。事实上,为了澄清我的意图,我需要让obj2的行为类似于对obj1所做修改的观察者。@Alio:如果需要
obj2
来反映对
obj1
所做的所有更改,为什么不直接做
obj2=obj1?然后两个变量都指向同一个对象树,因此(当然)通过其中一个变量所做的任何更改都可以通过另一个变量看到,因为它们都指向同一棵树。如果这不起作用,我很好奇:用例是什么?