Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Declaring static constants in ES6 classes?

I want to implement constants in a class, because that's where it makes sense to locate them in the code.

So far, I have been implementing the following workaround with static methods:

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

I know there is a possibility to fiddle with prototypes, but many recommend against this.

Is there a better way to implement constants in ES6 classes?

like image 404
Jérôme Verstrynge Avatar asked Sep 18 '15 08:09

Jérôme Verstrynge


People also ask

How do we declare a constant in ES6 JavaScript?

ES6 provides a new way of declaring a constant by using the const keyword. The const keyword creates a read-only reference to a value. By convention, the constant identifiers are in uppercase. Like the let keyword, the const keyword declares blocked-scope variables.

Is const static JavaScript?

A static keyword is been used to declare a variable or a method as static. A const keyword is been used to assign a constant or a fixed value to a variable. In JavaScript, the static keyword is used with methods and classes too. In JavaScript, the const keyword is used with arrays and objects too.

Is there a static variable in JavaScript?

Static variable in JavaScript: We used the static keyword to make a variable static just like the constant variable is defined using the const keyword. It is set at the run time and such type of variable works as a global variable. We can use the static variable anywhere.

What are ES6 classes in JavaScript?

There are two types of Class in ES6: parent class/super class: The class extended to create new class are know as a parent class or super class. child/sub classes: The class are newly created are known as child or sub class. Sub class inherit all the properties from parent class except constructor.


2 Answers

Here's a few things you could do:

Export a const from the module. Depending on your use case, you could just:

export const constant1 = 33; 

And import that from the module where necessary. Or, building on your static method idea, you could declare a static get accessor:

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

That way, you won't need parenthesis:

const one = Example.constant1; 

Babel REPL Example

Then, as you say, since a class is just syntactic sugar for a function you can just add a non-writable property like so:

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

It may be nice if we could just do something like:

class Example {     static const constant1 = 33; } 

But unfortunately this class property syntax is only in an ES7 proposal, and even then it won't allow for adding const to the property.

like image 172
CodingIntrigue Avatar answered Oct 21 '22 13:10

CodingIntrigue


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

Seems to work for me.

like image 39
Benny Jobigan Avatar answered Oct 21 '22 13:10

Benny Jobigan