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
        }
    };
}

我将打破小提琴并尝试使我的问题清楚。

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

请参阅:Javascript 指针/引用疯狂。有人可以解释一下吗?

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

以防万一您的 JS 引擎与我的引擎有所不同,以下是我计算机上的结果(Windows 7 在 Chrome 中运行)。

所有 Deeply Nested Values 都变为 Null,而 Original 值是唯一改变的值

4

2 回答 2

2

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

您可以随时简单地使用console.log(object)来查看对象结构。(第一级,当你扩展对象时,你会看到扩展时的结构。)

例如:

安慰

于 2013-08-01T21:21:15.113 回答
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
        }
    };
}
于 2013-08-01T21:23:55.997 回答