プロトタイプ - JavaScriptの個人的なメモ (その4)

このメモについて

他の言語とJavaScriptの違いに関する個人的なメモですので、誤りがあるかもしれません。見つけたらご指摘ください。

前回のメモ

thisの遅延束縛 - JavaScriptの個人的なメモ (その3)

http://d.hatena.ne.jp/dhrname/20121026

プロトタイプ

JavaScriptのプロトタイプは、単純なので誰でも簡単にできます。

createメソッド

このメモでは、前もって、プロトタイプの設定処理をまとめておいたcreateメソッドを作っておき、関数用のメソッドとして使うこととします。

/*コンストラクタ関数用のメソッド*/
Function.prototype.create = function(o) {
  this.prototype = o || {};
  return new this();
};

続けて、このcreateメソッドを使って、オブジェクトa、bとcの三つを作ってみましょう。bはaを継承させ、cはbを継承させます。

var A = function() {
      var that = this,
          n = 0;
      that.hoge = function() {
        n++;
        return n;
      };
    },
    B = function(){
      
    },
    /*それぞれプロトタイプを設定してオブジェクトを作成*/
    a = A.create(),
    b = B.create(a),
    c = B.create(b);

a.hoge();  /* 1 を返す*/
b.hoge();  /* 2 を返す*/
c.hoge();  /* 3 を返す*/

aのhogeメソッドを、bとcの二つのオブジェクトに継承させることができました。この点は、クラスベースのオブジェクト指向のような継承に思えるかもしれません。
しかし、これら二つのbとcは、クラスや関数Aではなく、オブジェクトaそのものを継承しているのです。

プロトタイプにおけるオーバライド

ここでは、ためしに、オブジェクトaのhogeメソッドを書き換えてみましょう。

a.hoge = function() {
  return 12;
};

b.hoge(); /* 12 を返す*/
c.hoge(); /* 12 を返す*/

bとcのhogeメソッドも、aみたいに変化しました。つまり、bもcもオブジェクトaを直接、継承しています。
関係は、aは親オブジェクト、bは子オブジェクト、cは孫オブジェクトとなります。

結論

  • プロトタイプはオブジェクトを直接、継承できるので、単純でかんたんです
  • クラスや関数ではなく、オブジェクトがひな型となります

続き

プロパティと継承 JavaScriptの個人的なメモ (その5)

http://d.hatena.ne.jp/dhrname/20121106