2013-08-01 136 views
3

我明显不明白关于JS对象的东西。Javascript对象和嵌套

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

+0

您可以使用对象操场上玩耍:http://www.objectplayground.com/ –

回答

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

哇,很好,谢谢。仍然没有解释为什么当另一个对象时嵌套对象不会改变,但它解释了空值。 – deltree

+0

更新我的回答是一个实际的答案:) – Bart

+0

壮观。非常感谢。 – deltree

2

显示代码/标记是错误的。

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

例如:

Console

+0

这对我来说并不实用。我知道如何使用console.log,我正在构建一个简洁的例子。 – deltree

+0

@deltree,这指出你的问题中的错误,并显示真正发生了什么。提示:尽可能减少问题和代码,以重现您遇到的问题。到底什么是你期望的结果是在变化之后?对象通过引用传递。 – Qtax