イナヅマTVログ

[MEMO] ES2015(ES6)でSingletonはどうしよう

| 0件のコメント

JavaScript を ES2015 で書くと「意識高い系」になると噂があるとかないとか…

Babel な人に助けてもらうらしい。
Babel

Babel: Learn ES2015
見ると大分いい感じな様子。

class, extends も使える…

で、Singleton はどう書く?

Google 先生に聞きました。
es2015 singleton
es6 singleton

なんか色々見つかった。
色々見つかる時は決定打がないことが多いんだよな(ゴニョゴニョ…)

export を instance にするやつ

Gist: milankarunarathne/ES6_Singlet.js

Symbol を使うやつ

Gist: SanderLi/Singleton.js

let instance を使うやつ

Singleton class in es6

雰囲気で選ぶと let instance かなぁ。
こんな感じでしょうか

let _instance = null;
 
class SingleTon {
  constructor() {
    if ( _instance !== null ) {
      throw new Error('SingleTon.instance()してね');
    }
    if ( _instance === null ) {
        _instance = this;
    }
 
    return _instance;
  }
 
  static instance() {
    if ( _instance === null ) {
      _instance = new SingleTon();
    }
    return instance
  }
}

最初の1回 new SingleTon() できちゃうのがなぁ。。。
う〜ん、悩ましい。

おまけ

Babel · The compiler for writing next generation JavaScript
へコードを突っ込むと下位互換なコードが見れます。

げっ、美しくない。。。


【追記】
symbol 追加すると new SingleTon() できないことは投稿してすぐに気づいたけど…

let _instance = null;
let _symbol = Symbol();
 
class SingleTon {
  constructor( target ) {
    if ( _symbol !== target || _instance !== null ) {
      throw new Error('SingleTon.instance()してね');
    }
    _instance = this;
    return _instance;
  }
 
  static instance() {
    if ( _instance === null ) {
      _instance = new SingleTon( _symbol );
    }
    return instance
  }
}

全部 static で書いた方が簡単じゃないかと考え始めて悶々としている今日この頃です。

コメントを残す