2012-04-02 74 views
3

這是一個關於JavaScript getters和setter如何工作的問題。在JavaScript getter/setter中使用delete刪除getter/setter

Mozilla將log4j作爲JavaScript模塊實現(部分實現,只是諸如Firefox Sync等預期用例所需的重要部分)包含以下getter/setter定義。

getter/setter中的'delete'會爲你做什麼?那有什麼意思?它似乎有使第一次使用有不同的結果從以下用途(但如果是這樣,如何)?

get repository() { 
    delete Log4Moz.repository; 
    Log4Moz.repository = new LoggerRepository(); 
    return Log4Moz.repository; 
}, 
set repository(value) { 
    delete Log4Moz.repository; 
    Log4Moz.repository = value; 
}, 

回答

0

刪除操作刪除的對象的屬性。如果你有一個對象

o = {a:「hello」,b:「world」};

和你做

刪除o.a;

你的對象看起來就像這樣

O = {B: 「世界」};

之後,如果你做

o.a = 「富」;

這將增加新的屬性到對象O併爲其分配值 「foo」 和你的對象會像

O = {A: 「富」,B: 「世界」} ;

+1

之後,如果它是以這種方式開始的話,那麼o.a仍然是一個吸氣器(或二流子)嗎?我猜不,現在它只是一個價值,對吧? (你怎麼知道一個屬性是否是一個getter/setter?有沒有一種方法來檢查/轉儲說明哪些屬性是getters/setters的對象?) – 2012-04-03 17:06:06

2

問題(和現有的答案)缺少一個重要的上下文; get4和setter在Log4Moz對象上定義。考慮到這一點,當getter或setter被調用時會發生什麼,並刪除了它定義的屬性?

delete訪問器屬性(具有get/set的屬性)與數據屬性具有相同的效果,即它刪除屬性。執行delete Log4Moz.repository後,屬性不再存在於Log4Moz對象上,並且getter/setter函數不再綁定到該屬性。

下一行,分配給Log4Moz.repository的行爲與您所期望的相同。使用給定值在Log4Moz對象中創建數據屬性。

實際上,這樣做是在第一次訪問(get或set)之後用data屬性替換訪問器屬性,從而產生一個懶惰初始化的數據屬性。

+0

優秀的答案。 – 2012-07-08 01:13:53