Javascript属性镜像到另一个实例

时间:2012-11-29 15:20:46

标签: javascript properties override

假设我们在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相同类型的实例。我们怎么能这样做?

2 个答案:

答案 0 :(得分:1)

如果我理解正确,obj1.prop1.prop1_1obj2.prop1.prop1_1不是同一个对象,您希望将前者的prop1_1_1属性设置为设置后者的财产相同。

从ES5开始,这是可能的 property getters and/or setters,但我认为我不推荐它。 : - )

以下是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

Live Copy(在控制台中查看)| Source

答案 1 :(得分:1)

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

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_1 [0],也会更改obj1.prop1.prop1_1.prop1_1_1 [0]。

这是因为当你将它定义为[3]时,它实际上创建了一个Array对象并将其引用(也就是指针)存储在obj1.prop1.prop1_1.prop1_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并且更改一个不会更改另一个