Javascript es6 override static properties

后端 未结 2 610
有刺的猬
有刺的猬 2021-01-05 13:50

Trying out ES6 and tried to create a class with static properties and function for parsing. Then I want to extend the base parser for each different type I am parsing. Not s

2条回答
  •  独厮守ぢ
    2021-01-05 14:03

    Classes are functions (in transpiled code), and when you define static properties, they are attached directly to the class constructor function, so:

    class Foo {
        static name = 'foo';
    }
    

    is the same as doing

    function Foo(){}
    Object.defineProperty(Foo, 'name', {
        configurable: true,
        writable: true,
        value: 'foo'
    });
    

    If you try doing that in your browser, you will get an error, which is exactly what you are seeing. This is because the function already has a property called name and it is Foo. In ES5, the name property was configurable: false, so what you are trying to do will not work, hence the TypeError: Cannot redefine property: name error and you need to rename your static to something else.

    In ES6, name is actually configurable: true so what you are trying to do will work eventually, but browsers need to update themselves first.

    The bigger question here is why you need to use a class. If you are using all static variables, you might as well just use a module that exports everything directly without the class, and wrap it. It have a module that exports a creation function that you pass an innerParser method or something. Your current code way over-uses classes.

提交回复
热议问题