1

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

4

2 回答 2

1

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

从 ES5 开始,属性 getter 和/或 setter可以做到这一点,但我不认为我会推荐它。:-)

这是一个 getter on从'sobj2.prop1.prop1_1.prop1_1_1获取值的示例: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(查看控制台)| 资源

于 2012-11-29T15:25:28.383 回答
1

如果 TJ 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_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,并且更改一个不会更改另一个

于 2012-11-29T15:29:26.733 回答