Search code examples
javascriptclassconstantsecmascript-6

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?


Solution

  • 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.