2017-10-19 88 views
2

This article describe getters。它有一個部分「 智能/自我重寫/懶惰的獲得者」 而且我不清楚,默認情況下是getter'memoized',還是我應該自己實現這個功能javascript和memoized getters

class Foo() { 
    get boo() { 
    this._boo = this._boo || new Boo(); 
    return this._boo; 
    } 
} 

或可我只是寫:

class Foo() { 
    get boo() { 
    return new Boo(); 
    } 
} 

有相同的結果呢?

+1

每當*獲得*值時,* getter *被調用。而已。 Theres沒有meo化,直到你實現它 –

+0

他們不是默認情況下,你必須自己做。 – Rafael

+1

這是什麼意思,默認情況下,getters是* lazy *,但是你需要自己處理記憶(並給出了一個如何實現這樣的例子)。 – Phylogenesis

回答

2

不,在JavaScript中沒有對memoized getter的語言級支持。在第二個示例中,每次訪問boo時都會創建一個新對象。

0

考慮下面的代碼:

class Person { 
    static get SHORT() { return 0; }//rvalue 
} 

class Person {} 
Person.SHORT = 0;//lvalue 

雖然都返回相同的結果,後者實際上是快(因爲它避免了函數調用的開銷);儘管js引擎可以進行優化,使其中一個無效。

0

該文章的最有趣的一點是Smart/self-overwriting/lazy getters,它提供了這種技術:

class Foo { 
    get boo() { 
    delete this.boo; 
    return this.boo = new Boo(); 
    } 
} 

有了這個你Foo對象沒有通過,直到你問它創建他們boo性質的麻煩去。然後它被創建一次,並進一步請求它只是返回相同的對象。這是有道理的,如果new Boo()在某種程度上是資源密集型創建,並且經常不需要。

從理論上講,您可以擴展它以允許您刪除當前版本並在下次訪問時重新創建它。但是,這是更多的代碼,可能是一個相當罕見的需求。