2017-10-19 21 views
2

This article describe getters. Il a une section « intelligente/auto-Écrasement/getters paresseux » Et on ne sait pas pour moi, les accesseurs « memoized » par défaut ou devrais-je mettre en œuvre cette fonctionnalité par moi-mêmejavascript et getters memoized

par exemple

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

ou puis-je simplement écrire:

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

pour avoir le même résultat?

+1

Chaque fois que vous obtenez * une valeur, le * getter * est appelé. C'est tout. Theres pas de meoization jusqu'à ce que vous l'implémentiez –

+0

Ils ne sont pas par défaut, vous devez le faire vous-même. – Rafael

+1

Ce que cela signifie, c'est que les getters sont * paresseux * par défaut, mais vous devez gérer vous-même la mémorisation (et donne un exemple de la façon de l'implémenter). – Phylogenesis

Répondre

2

Non, il n'y a pas de support de langage pour les accesseurs memoized en JavaScript. Dans votre deuxième exemple, un nouvel objet serait créé chaque fois que boo a été accédé.

0

considèrent ce code:

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

contre

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

Bien que le même résultat, celui-ci est plus rapide (car elle évite la surcharge d'appel de fonction); bien que le moteur js puisse faire des optimisations qui annulent l'une sur l'autre.

0

Le bit le plus intéressant de cet article était Smart/self-overwriting/lazy getters, qui offre cette technique:

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

Avec ce vos objets Foo ne passent pas par les tracas de la création de leurs propriétés boo jusqu'à ce que vous demandez. Ensuite, il est créé une fois et d'autres demandes pour cela retournent simplement le même objet. Cela a du sens si new Boo() est en quelque sorte gourmande en ressources à créer et n'est pas souvent nécessaire. Théoriquement, vous pouvez étendre ceci pour vous permettre de supprimer la version actuelle et de la recréer lors de l'accès suivant. Mais c'est beaucoup plus de code, et c'est probablement un besoin assez rare.