2017-10-19 46 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()在某种程度上是资源密集型创建,并且经常不需要。

从理论上讲,您可以扩展它以允许您删除当前版本并在下次访问时重新创建它。但是,这是更多的代码,可能是一个相当罕见的需求。