我想這如何使用存在的財產對象
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!"
如何使用第一種方法使其工作?
我想這如何使用存在的財產對象
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!"
如何使用第一種方法使其工作?
你不能。
這就是文字object declaration是如何在JavaScript中設計的;沒有自引用可以工作
所有對this
的引用都是根據代碼的運行範圍來解析的,如果您處於全局範圍內,則默認爲window
。
更新
而不訴諸新的getter和setter語法,你可以做兩件事情:
構建對象,但省去了具有自我引用的屬性;之後,追加它們。這也是你所做的。
打開一個屬性,而不是一個功能:
var a = {
"a" : "Hey",
"b" : function() { return this.a + "!"; }
};
console.log(a.b()); // "Hey!"
小心使用這種方法,因爲改變的a.a
值也會影響a.b()
輸出。
實際上,自引用部分並非完全正確 - 如果您聲明函數調用它,'this'實際上是指對象。另外ES5有setter和getters(就像我在我的回答中所述)來實現這一點。 – Christoph
@Christoph:這個答案並不否認AFAICS。它只是說沒有任何語法結構來引用對象* literal *中的現有屬性。你在談論運行時間的行爲。 –
@Christoph是的,就像我說過的,對'this'的引用是根據範圍來解決的;在對象的函數調用的情況下,作用域本身就是對象(假設函數明確地或隱式地綁定到它)。 –
this
不存在於對象字面量的上下文中。您將不得不編寫a.a
而不是this.a
。但是,在對象中定義的函數內部時,實際上是指對象本身。
這與JavaScripts參考環境有關。
'this' * does * exists,but it does not refer the object。在那一刻,它們都不會'a'(如果你建議使用「b」:a.a +「!」',那麼你的答案就不太清楚了)。 –
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.a
爲foo
!
沒有辦法指向構造對象字面值。你必須改變第一種方式,就像第二種方式一樣。如果這不適合你,你的確切要求是什麼? –
歡迎來到SO!這個問題之前已經被問到(和回答),請參閱http://stackoverflow.com/questions/4616202/self-references-in-object-literal-declarations – georg