JavaScript 对象和嵌套

3

我显然对JS对象的某些内容不理解。

http://jsfiddle.net/q3SCF/2/

function baseObject () {
    var self = this;

    self.value = "value";
    self.nestedObject = function () {
        var nest = this;

        nest.value = self.value;
        nest.deepNest = function() {
            var deep = this;

            deep.value = nest.value;
            deep.selfValue = self.value;
        };
    };
    self.nestedObject2 = {
        value: self.value,
        deepNest: {
            value: this.value,
            selfValue: self.value
        }
    };
}

我将分解这个fiddle并尝试让我的问题更清晰。
我对JS对象的理解是,虽然按值传递,但将一个对象设置为另一个对象时,它们应该都指向同一个值,因此当原始对象被更新时,被设置为其等价的对象也会被更新。
见:Javascript指针/引用疯狂。有人能解释一下吗? 首先,我没有看到发生这种情况(这正是我想要发生的)。但更奇怪的是,如果嵌套得足够深,我看到的值实际上变成了NULL,当我改变基本对象时。请帮帮我。我显然错过了什么。
以防万一您的JS引擎与我的不同,在我的计算机上(在Chrome中运行的Windows 7上)结果如下图所示:

你可以在Object playground上玩耍:http://www.objectplayground.com/ - Akhil Sekharan
2个回答

2

你的演示代码/标记有误。

你可以简单地使用console.log(object)在任何时候查看对象的结构。(第一级,当您展开对象时,您将看到扩展时的结构。)

例如:

Console


这对我没有用。我知道如何使用console.log,我只是在构建一个简洁的例子。 - deltree
@deltree,这指出了你问题中的错误,并展示了实际发生的情况。提示:尽可能将问题和代码简化,以重现你遇到的问题。你期望改变后的结果是什么?对象是按引用传递的。 - Qtax

1
我的理解是,JS对象虽然是按值传递的,但当一个对象被赋值给另一个对象时,它们应该都指向同一个值,因此当原始对象更新时,被赋值的对象也会更新。
Javascript通过按值复制引用。在您的示例中,所有变量都保存了对原始self.value的复制引用。当您为self.value分配新值时,只有该变量将保存对该新值的引用。所有其他变量仍将指向旧引用。
您可以使您的情景正常工作的唯一方法是创建一个self.value对象并读取属性。当更改该属性时,不会丢失对原始对象的引用。

http://jsfiddle.net/q3SCF/13/

function baseObject () {
    var self = this;

    self.value = {p:"value"};
    self.nestedObject = function () {
        var nest = this;

        nest.value = self.value;
        nest.deepNest = function() {
            var deep = this;

            deep.value = nest.value;
            deep.selfValue = self.value;
        };
    };
    self.nestedObject2 = {
        value: self.value,
        deepNest: {
            value: this.value,
            selfValue: self.value
        }
    };
}

哇,好发现,谢谢。虽然这仍然无法解释为什么嵌套对象在另一个对象更改时不会改变,但它解释了空值的问题。 - deltree
更新了我的答案,变成了一个真正的回答 :) - Bart
壮观的。非常感谢。 - deltree

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接