2013-07-02 23 views
4

我想這如何使用存在的財產對象

var a = { 
    "a" : "Hey", 
    "b" : this.a + "!" 
}; 

console.log(a.b); 

==>"undefined!" 

,但如果我用這個正常工作。

var a = {}; 
a.a = "haha"; 
a.b = a.a + "!"; 

console.log(a.b); 

==>"haha!" 

如何使用第一種方法使其工作?

+1

沒有辦法指向構造對象字面值。你必須改變第一種方式,就像第二種方式一樣。如果這不適合你,你的確切要求是什麼? –

+1

歡迎來到SO!這個問題之前已經被問到(和回答),請參閱http://stackoverflow.com/questions/4616202/self-references-in-object-literal-declarations – georg

回答

5

你不能。

這就是文字object declaration是如何在JavaScript中設計的;沒有自引用可以工作

所有對this的引用都是根據代碼的運行範圍來解析的,如果您處於全局範圍內,則默認爲window

更新

而不訴諸新的getter和setter語法,你可以做兩件事情:

  1. 構建對象,但省去了具有自我引用的屬性;之後,追加它們。這也是你所做的。

  2. 打開一個屬性,而不是一個功能:

    var a = { 
        "a" : "Hey", 
        "b" : function() { return this.a + "!"; } 
    }; 
    
    console.log(a.b()); // "Hey!" 
    

小心使用這種方法,因爲改變的a.a值也會影響a.b()輸出。

+0

實際上,自引用部分並非完全正確 - 如果您聲明函數調用它,'this'實際上是指對象。另外ES5有setter和getters(就像我在我的回答中所述)來實現這一點。 – Christoph

+0

@Christoph:這個答案並不否認AFAICS。它只是說沒有任何語法結構來引用對象* literal *中的現有屬性。你在談論運行時間的行爲。 –

+0

@Christoph是的,就像我說過的,對'this'的引用是根據範圍來解決的;在對象的函數調用的情況下,作用域本身就是對象(假設函數明確地或隱式地綁定到它)。 –

6

this不存在於對象字面量的上下文中。您將不得不編寫a.a而不是this.a。但是,在對象中定義的函數內部時,實際上是指對象本身。

這與JavaScripts參考環境有關。

+1

'this' * does * exists,but it does not refer the object。在那一刻,它們都不會'a'(如果你建議使用「b」:a.a +「!」',那麼你的答案就不太清楚了)。 –

2

Ecmascript第5版引入了一些很好的對象:Setters和getters。 在現代瀏覽器,你可以使用getter method達到你要的結果:

var a = { 
    "a" : "Hey", 
    get b(){ return this.a + "!" }, 
    set c(x){ this.a = x} 
}; 

現在a.b會給你正確的結果Hey!

c的setter函數會導致正常的賦值a.c = "foo"實際設置a.afoo