みかづきブログ その3

3ヶ月つづけてみました。

JavaScriptでクラス定数を継承したいという想い

いままでクラス定数は static と get をつかって書いていました。

class Klass {
  static get CONST() {
    return {
      HOGE : 1,
      FUGA : 2,
      PIYO : 3
    };
  }
}

console.log(Klass.CONST.HOGE); // => 1

なんとなくCONSTというオブジェクトの中に定数を入れるという書き方をしていたのですが、
継承すると親クラスのものを辿れなくなるという問題点がありました。

class SuperKlass {
  static get CONST() {
    return {
      HOGE : 1,
      FUGA : 2,
      PIYO : 3
    };
  }
}

class SubKlass extends SuperKlass {
  static get CONST() {
    return {
        PIYO : 4,
        PON : 5
    };
  }
}

console.log(SubKlass.CONST.PIYO); // => 4
console.log(SubKlass.CONST.PON); // => 5
console.log(SubKlass.CONST.HOGE); // => undefined 1が出て欲しい!

今回はこれの解決策を考えます。


解決策1 CONSTオブジェクトを廃止する

class SuperKlass {
  static get HOGE() {
    return 1;
  }

  static get FUGA() {
    return 2;
  }

  static get PIYO() {
    return 3;
  }
}

class SubKlass extends SuperKlass {
  static get PIYO() {
    return 4;
  }

  static get PON() {
    return 5;
  }
}

console.log(SubKlass.PIYO); // => 4
console.log(SubKlass.PON); // => 5
console.log(SubKlass.HOGE); // => 1

ものすごく簡単に解決します。
が。個人的にはCONSTオブジェクトでまとめたい。
深い意味はないんですがCONSTオブジェクトでまとめたいのです。

解決策2 親のCONSTオブジェクトにマージしてリターンする

class SuperKlass {
    static get CONST() {
        return Object.assign(super.CONST || {}, {
            HOGE : 1,
            FUGA : 2,
            PIYO : 3
        });
    }
}

class SubKlass extends SuperKlass {
    static get CONST() {
        return Object.assign(super.CONST || {}, {
            PIYO : 4,
            PON : 5
        });
    }
}

console.log(SubKlass.CONST.PON); // => 5
console.log(SubKlass.CONST.PIYO); // => 4
console.log(SubKlass.CONST.HOGE); // => 1

Objectアサインをつかえば解決できます。
確実に親クラスが存在し、かつ親クラスがスタティックなCONSTオブジェクトを持っているのであれば、単純にマージすればよいのですが、そうとは限らないので、super.CONSTがFalsyな値の場合は空のオブジェクトを使うようにしています。

ここまでして、クラス定数をCONSTオブジェクトにまとめたいかと言われれば謎です。