2011年1月7日金曜日

JavaScript のクラス定義と継承

クラスの定義

正直色々ありすぎて難しい。
クロージャでやる場合と、プロトタイプでやる場合とに分けられるっぽい。

クロージャによるクラスの定義
function Calc(x, y)
{
 this.x = x;
 this.y = y;
 this.add = function()
 {
  return x + y;
 }
}
alert(new Calc(1,2).add());
プロトタイプによるクラスの定義その1
function Calc()
{
 this.initialize.apply(this, arguments);
}

Calc.prototype.x = 0;
Calc.prototype.y = 0;
Calc.prototype.initialize = function()
{
 var o = this;
 o.x = arguments[0];
 o.y = arguments[1];
}
Calc.prototype.add = function()
{
 var o = this;
 return o.x + o.y;
}

alert(new Calc(1,2).add()); // 結果 : 3

こちらは、プロトタイプに追加している。

プロトタイプによるクラスの定義2
function Calc()

 this.initialize.apply(this, arguments);
}

Calc.prototype = 
{
 x : 0,
 y : 0,
 initialize : function()
 {
  x = arguments[0];
  y = arguments[1];
 },
 add : function()
 {
  return x + y;
 }
}

alert(new Calc(1,2).add()); // 結果3

こちらは、プロトタイプを上書きしている。
こっちのほうがスッキリしてていいけど、これだと継承するときに問題がある。

クラスの継承

クラスにも色々と方法がある。
とりあえず、プロトタイプによる継承の場合、基本的には

function CalcEx()
{
 this.initialize.apply(this, arguments);
}

CalcEx.prototype = new Calc();

alert(new CalcEx(3,4).add()); // 結果7

とするわけだけど、継承したクラスを『プロトタイプによるクラスの定義2』の パターンで定義してしまうと、プロトタイプを上書きしてしまうので、 継承元で定義した prototype が消えてしまう。 なので、プロトタイプを利用したクラス定義を行うなら、プロトタイプに追加する パターンが望ましい。

※もっとも、色々な方法でもって、拡張する方法がいくらでも存在する。要勉強

0 件のコメント:

コメントを投稿