Statische constanten declareren in ES6-klassen?

Ik wil constanten in een classimplementeren, omdat het daar logisch is om ze in de code te vinden.

Tot nu toe heb ik de volgende tijdelijke oplossing geïmplementeerd met statische methoden:

class MyClass {
    static constant1() { return 33; }
    static constant2() { return 2; }
    // ...
}

Ik weet dat er een mogelijkheid is om met prototypes te spelen, maar velen raden dit af.

Is er een betere manier om constanten in ES6-klassen te implementeren?


Antwoord 1, autoriteit 100%

Hier zijn een paar dingen die u kunt doen:

Exporteer een constuit de module. Afhankelijk van uw gebruikssituatie kunt u het volgende doen:

export const constant1 = 33;

En importeer dat waar nodig uit de module. Of, voortbouwend op uw idee van een statische methode, zou u een staticaccessor ophalen:

const constant1 = 33,
      constant2 = 2;
class Example {
  static get constant1() {
    return constant1;
  }
  static get constant2() {
    return constant2;
  }
}

Op die manier heb je geen haakjes nodig:

const one = Example.constant1;

Babel REPL-voorbeeld

Dus, zoals je zegt, aangezien een classgewoon syntactische suiker is voor een functie, kun je gewoon een niet-schrijfbare eigenschap toevoegen, zoals:

class Example {
}
Object.defineProperty(Example, 'constant1', {
    value: 33,
    writable : false,
    enumerable : true,
    configurable : false
});
Example.constant1; // 33
Example.constant1 = 15; // TypeError

Het zou leuk zijn als we iets konden doen als:

class Example {
    static const constant1 = 33;
}

Maar helaas is deze syntaxis voor klasseneigenschappenalleen in een ES7-voorstel, en zelfs dan het staat niet toe om consttoe te voegen aan de eigenschap.


Antwoord 2, autoriteit 12%

class Whatever {
    static get MyConst() { return 10; }
}
let a = Whatever.MyConst;

Het lijkt voor mij te werken.


Antwoord 3, autoriteit 5%

Ik gebruik babelen de volgende syntaxis werkt voor mij:

class MyClass {
    static constant1 = 33;
    static constant2 = {
       case1: 1,
       case2: 2,
    };
    // ...
}
MyClass.constant1 === 33
MyClass.constant2.case1 === 1

Houd er rekening mee dat je de vooraf ingestelde "stage-0"nodig hebt.
Om het te installeren:

npm install --save-dev babel-preset-stage-0
// in .babelrc
{
    "presets": ["stage-0"]
}

Bijwerken:

gebruik momenteel stage-3


Antwoord 4

Hier ga je!

const Status = Object.freeze(class Status {
  static Disabled = 0
  static Live = 1
})

Antwoord 5

Als je probeert een const/variabele statisch te maken voor een klasse; probeer de hash (#) te gebruiken om een ​​plaatshouder te definiëren, dan een functie om er toegang toe te krijgen.

class Region {
    // initially empty, not accessible from outside
    static #empty_region = null; 
    /* 
        Make it visible to the outside and unchangeable 
        [note] created on first call to getter.
    */
    static EMPTY() {
        if (!this.#empty_region)
            this.#empty_region = new Region(0, 0, 0, 0);
        return this.#empty_region;
    }
    #reg = {x0:0, y0:0, x1:0, y1:0};
    constructor(x0, y0, x1, y1) { 
        this.setRegion(x0, y0, x1, y1);
    }
    // setters/getters
}

Implementatie:

let someRegion = Region.EMPTY();
let anotherRegion = Region.EMPTY();

Other episodes