ES6 Classes - Updating Static Properties

后端 未结 3 809
再見小時候
再見小時候 2020-12-06 00:58

I am trying to figure out alternative ways to set a static (or class) property an ES6 Class and then change it after new instances of the class are created.

For exa

相关标签:
3条回答
  • 2020-12-06 01:40

    There's no such thing as static all = [] in ES6. Class instance and static fields are currently stage 3 proposals which can be used via a transpiler, e.g. Babel. There's already existing implementation in TypeScript that may be incompatible with these proposals in some way, yet static all = [] is valid in TS and ES.Next.

    Geo.all = [];
    

    is valid and preferable way to do this in ES6. The alternative is getter/setter pair - or only a getter for read-only property:

    class Geo {
      static get all() {
        if (!this._all)
          this._all = [];
    
        return this._all;
      }
    
      constructor() { ... }
    }
    

    Tracking instances in static property can't generally be considered a good pattern and will lead to uncontrollable memory consumption and leaks (as it was mentioned in comments).

    0 讨论(0)
  • 2020-12-06 01:48

    I recently had a similar issue of creating static classes.

    I first tried it with constant class variables, but Chrome debugger threw an error. So I defined the class variables 'static', also the getter methods.

    Worked in Chrome.

    class TestClass {
      //static properties.
      static _prop1 = [ 'A', 'B', 'C'];
      static _prop2 = true;
      static _prop3 = 'some String';
      
      //constructor. Commented out because the class only has static elements.
      //constructor () {}
      
      //Getters.
      static get prop1 () {
        return this._prop1;
      }
      
      static get prop2 () {
        return this._prop2;
      }
      
      static get prop3 () {
        return this._prop3;
      }
    }

    0 讨论(0)
  • 2020-12-06 01:49

    This works for me for static properties.

      class NeoGeo {
    
        constructor() {
    
        }
    
        static get topScore () {
          if (NeoGeo._topScore===undefined) {
            NeoGeo._topScore = 0; // set default here
          }
    
          return NeoGeo._topScore;
        }
    
        static set topScore (value) {
          NeoGeo._topScore = value;
        }
    
      }
    

    And your example:

      class NeoGeo {
    
        constructor() {
          NeoGeo.addInstance(this);
          console.log("instance count:" + NeoGeo.all.length);
        }
    
        static get all () {
    
          if (NeoGeo._all===undefined) {
            NeoGeo._all = [];
          }
    
          return NeoGeo._all;
        }
    
        static set all (value) {
          NeoGeo._all = value;
        }
    
        static addInstance(instance) {
          // add only if not already added
          if (NeoGeo.all.indexOf(instance)==-1) {
            NeoGeo.all.push(instance);
          }
        }
      }
    

    Note: In the getter you could also check for the existence of the property using the in keyword or the hasOwnProperty keyword.

        static get topScore () {
          if (!("_topScore" in NeoGeo)) {
            NeoGeo._topScore = 0; // set default here
          }
    
          return NeoGeo._topScore;
        }
    

    And using hasOwnProperty:

        static get topScore () {
          if (NeoGeo.hasOwnProperty("_topScore")==false) {
            NeoGeo._topScore = 0; // set default here
          }
    
          return NeoGeo._topScore;
        }
    
    0 讨论(0)
提交回复
热议问题