プロトタイプ継承について

前回気が向いたらプロトタイプについて書くとか言っていた気がするので、
今回はそれの続きです。

プロトタイプオブジェクトを使うメリット

前回コンストラクタにメソッドを定義していく書き方をしてましたが、
コンストラクタにメソッドを追加していけばいくほど、
無駄なメモリは増えます。
これはインスタンス化によって毎回メソッドがコピーされるためです。
メソッド部分は毎回中身は同じものなのに、これを毎回コピーするのは非常に無駄です。
そこでプロトタイプを使います。

プロトタイプとは

JSでは、すべてのオブジェクトがprototypeプロパティを持っています。
prototypeプロパティはデフォルトで空のオブジェクト(プロトタイプ・オブジェクト)を参照しています。
これにプロパティやメソッドを追加していきます。

基本的な書き方

クラス名.prototype.メソッド名 = function (メソッド引数){ メソッド本体 }

サンプル

//コンストラクタ設定
var MyClass = function (donna, kanji) {
  this.donna = donna;
  this.kanji = kanji;
}

//プロトタイプ継承を使ったクラス定義
MyClass.prototype.toString = function() {
  window.alert(this.donna +' '+ this.kanji);
};

//コンストラクタの呼び出し(インスタンス生成)
var obj = new MyClass('sugoku', 'nemui');
//メソッド呼び出し
obj toString(); //「sugoku nemui」

こんなかんじで、追加したメソッドは、
コンストラクタを元に生成されたインスタンスから参照することができます。

プロトタイプの使いどころとしては、
●プロパティの宣言・・・コンストラクタで。
●メソッドの宣言・・・プロトタイプで。
という風に使い分けるのが良さげっぽいです。

オブジェクトリテラルを使った書き方

.演算子を使ってプロトタイプにメソッドを追加する書き方でも良いのですが、
メソッドが多くなる場合はオブジェクトリテラルを使って書いた方がスッキリします。

//コンストラクタ設定
var MyClass = function (donna, kanji) {
  this.donna = donna;
  this.kanji = kanji;
}

//プロトタイプ継承を使ったクラス定義
//メソッドが増えたのでオブジェクトリテラルで記述
MyClass.prototype = {
  toString : function (){window.alert(this.donna +' '+ this.kanji);},
  getMessage : function (){return this.donna + this.kanji;}
};

以上、プロトタイプ継承についてざっくり書いてみました。
知識として知ってるレベルじゃなく、
ちゃんとしたコードを書けるようになりたい今日この頃です。