5
votes

Comment définir une variable statique dans une classe JS

Je construis une classe statique pour stocker des données dans un tableau et je veux déclarer une variable statique mais je ne sais pas comment le faire en javascript.

Code JS:

class GCache {

    // Define cache variable
    static cache = {}; // <--- that is what i don't know how to do

    /**
     * Check if data is on cache
     * @param {*} id 
     */
    static isOnCache(id){
        return this.cache.hasOwnProperty(id);
    }

    /**
     * Add data to cache
     * @param {*} id 
     * @param {*} json 
     */
    static addToCache(id, json){
        if(this.isOnCache(id)) return;
        this.cache[id] = json;
    }

    /**
     * Obtain data from cache
     * @param {*} id 
     */
    static getFromCache(id){
        if(this.isOnCache(id)) return;
        return this.cache[id];
    }

}

Merci


1 commentaires

3 Réponses :


0
votes

Les plugin-proposal-class-properties de Babel sont probablement ce que vous recherchez. Il permet la prise en charge des variables / méthodes statiques dans la déclaration de classe.


0 commentaires

6
votes

Actuellement * (voir le bas de la réponse pour plus de détails), les propriétés non fonctionnelles ne peuvent pas être ajoutées à une classe elle-même dans la définition de classe. Cela a l'air moche, mais vous devrez attribuer la propriété en dehors de la définition de classe:

class GCache {
  static cache = {};
  ...
}

Notez également que votre fonction getFromCache a probablement un bogue: vous voudrez probablement revenir plus tôt si l ' id recherché n'existe pas dans le cache:

class GCache {
  ...
}
GCache.cache = {};

const GCache = {
  cache: {},
  isOnCache(id) {
    return this.cache.hasOwnProperty(id);
  },
  addToCache(id, json) {
    if (this.isOnCache(id)) return;
    this.cache[id] = json;
  },
  getFromCache(id) {
    if (!this.isOnCache(id)) return;
    return this.cache[id];
  }
}
GCache.addToCache('myid', 'data');
console.log(GCache.getFromCache('myid'));

Mais, dans ce cas, il serait probablement plus facile d'utiliser un objet simple plutôt qu'une classe. La classe n'est pas utilisée pour instancier quoi que ce soit, après tout, et avec un objet, vous pouvez à la fois définir le cache à l'intérieur de l'objet et réduire le bruit de syntaxe en vous débarrassant de tous les statiquess:

class GCache {
    /**
     * Check if data is on cache
     * @param {*} id 
     */
    static isOnCache(id){
        return this.cache.hasOwnProperty(id);
    }

    /**
     * Add data to cache
     * @param {*} id 
     * @param {*} json 
     */
    static addToCache(id, json){
        if(this.isOnCache(id)) return;
        this.cache[id] = json;
    }

    /**
     * Obtain data from cache
     * @param {*} id 
     */
    static getFromCache(id){
        if(!this.isOnCache(id)) return;
        return this.cache[id];
    }

}
GCache.cache = {};
GCache.addToCache('myid', 'data');
console.log(GCache.getFromCache('myid'));

Il existe actuellement une proposition permettant vous permet de définir des propriétés statiques non-méthode sur une classe. Il est actuellement à l'étape 2, ce qui signifie qu'il devrait éventuellement être mis en œuvre officiellement. Une fois arrivé, le code:

if(!this.isOnCache(id)) return;

peut être remplacé par:

class GCache {
  ...
}
GCache.cache = {};


1 commentaires

Je vous remercie! C'est triste de lire que js ne le supporte pas. (<3 bug corrigé)



1
votes

Si vous parlez de variable statique pour toutes les instances de la classe, déclarer: GCache.cache = {} sous votre déclaration de classe


0 commentaires