Ik wil constanten in een class
implementeren, 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 const
uit 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 static
accessor 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;
Dus, zoals je zegt, aangezien een class
gewoon 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 const
toe 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 babel
en 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();