2011-03-13 60 views
7

在下面的代碼中,x成員是否可以從嵌套對象字面值進行訪問?如何從嵌套對象文字訪問外部成員?

var outer = { 
    x : 0, 
    inner: { 
     a : x + 1,  // 'x' is undefined. 
     b : outer.x + 1, // 'outer' is undefined. 
     c : this.x + 1 // This doesn't produce an error, 
    }     // but outer.inner.c is NaN. 
} 
+0

Int eresting。不知道它是否可以。 –

回答

9

就像你說的那樣 - 沒有。

需要兩個階段的建設,這將工作:

var outer = { x : 0 }; 
// outer is constructed at this point. 
outer.inner = { 
     b : outer.x + 1 // 'outer' is defined here. 
}; 
4

沒有在你有那裏的構造,沒有。

主要原因是outerinner之內時並不存在。

如果將inner的屬性更改爲函數,則可以在運行時訪問outer,但這將是非常難看的代碼。

考慮使用new outer();而是構築了一個對象,方式,那麼你可以使用thisinner,但隨後這是一個完全不同的結構和看起來像

var outer = function() { 
    this.x = 0; 
    this.inner = { 
     a: this.x + 1 
    };      
}; 

var b = new outer(); 

console.log(b.inner.a); // 1 
0

我不認爲那種的構想是有道理的。我不認爲有什麼阻止你說

var outer2; 
outer2.inner = outer.inner; 

在這種情況下,你會如何區分兩個父母?

做到這一點的方法可能是更多的構造函數類型函數,並根據需要將參數分配給outer.x和inner.whatever。