Javascript对象和嵌套

时间:2013-08-01 21:04:19

标签: javascript oop

我显然不了解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
        }
    };
}

我会打破小提琴,试着让我的问题清楚。

我对JS对象的理解是,在通过值传递时,当一个对象设置为等于另一个时,它们都应该指向相同的值,这样当原始对象更新时,则设置的对象相等它会更新。

请参阅:Javascript pointer/reference craziness. Can someone explain this?

首先,我没有看到这种情况发生(这就是我想要发生的事情)。但更奇怪的是,当我更改基础对象(如果它们已经足够嵌套)时,我看到这些值实际上变为NULL。请帮忙。我显然遗漏了一些东西。

为了防止你的JS引擎做了与我不同的事情,继续说'我的计算机上的结果是什么样的(Windows 7在Chrome中运行)。

All Deeply Nested Values turn to Null, and the Original value is the only value that changes

2 个答案:

答案 0 :(得分:2)

您的演示代码/标记错误。

您可以随时使用console.log(object)查看对象结构。 (第一级,当您展开对象时,您将看到扩展时的结构。)

例如:

Console

答案 1 :(得分: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
        }
    };
}