JavaScriptのクラスのエミュレート

とある本で現れた以下のコード。

var Class = function(){
    var klass = function(){
        this.init.apply(this, arguments);
    };
    klass.prototype.init = function(){};
    return klass;
};

var Person = new Class();

Person.prototype.init = function(){
    //初期化処理
}

//使い方
var person = new Person();

JavaScript でクラスをエミュレートするためのコード、と説明されていました。
ただ、眺めてみても意味がよくわらず、苦戦しました。

ある程度眺めてわかったこと

すこし時間をかけて眺めてみてわかったこと。

  • いろいろなクラスを作るためのベースになるコード
  • Class はコンストラクタ関数を返す
  • 返されたコンストラクタ関数を使ってオブジェクトのインスタンス化をする

でも、細かい処理についてはわかりません。

手を動かしてわかったこと。

手を動かしてみると、より詳細な動きがわかりました。
実際にコードを書いて、いろんなところにデバック用のコード(console.log())を書いて動きをみます。

  • Class によって返されたコンストラクタ関数内では必ず init が呼ばれる
  • この init が、オブジェクトのインスタンス化の初期化処理にあたる
  • 初期化時には、インスタンス化されるオブジェクト(this)と引数を init に渡すため apply を実行している

動きはだいたい分かったが

処理の流れはわかりましたが、ここであることに気づく。
このコードは、「なんのために紹介されていたのか?」。
インスタンス化するなら、もっと簡易な方法でも書けるし、あえてこのような書き方をしているのは何故か。

自分はのよくあるのですが、細かいところに夢中になって、全体のイメージとか目的がわからなくなったりします。

改めて全体を把握

落ち着いてみていると、このコードを紹介した目的は以下だと思いました。

  • 通常のコンストラクタ関数だと、new 演算子を忘れて実行した場合に、グローバル変数を汚染する
  • でも、このコードでは、new 演算子を忘れて実行した場合にエラーになるのでそれを防げる
  • 様々クラスを作るときに、このコードを基にクラスを生産できるので楽

こんな風に遠回りしましたが、無事に自分が納得いくところに落ち着きました!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です