Javascriptで知っておくべき知識  > prototype

2006年09月22日

Javascriptとプロトタイプベースオブジェクト指向

ほとんどのオブジェクト指向言語がクラスベースを採用している中、Javascriptはプロトタイプベースのオブジェクト指向言語です。実際にはかなり柔軟性に優れた言語なのですが、ただのスクリプト言語としてゴリゴリとプログラムを書いている人が多かった為に多くの人に誤解される不遇の時代を過ごしました。それがAjaxの登場でようやく見直されつつあります。

プロトタイプベース

プロトタイプベース言語では、オブジェクトは別のオブジェクトのプロトタイプ(原型)であると考えることができます。Javascriptでは、「prototypeプロパティ」を全ての関数オブジェクトが保持しています。このprototypeプロパティにオブジェクト(関数や変数)を保持することによってこの仕組みを実装しています。

// オブジェクト定義

var A = function(){};

A.prototype.value = 'ABC';

// オブジェクト実装

var a = new A();

alert('value:'+a.value) // value:ABC

"a.value"の値は"A.prototype.value"を参照しています。これはprototypeプロパティなしでは実装できません。以下に間違った例を記述します。

// オブジェクト定義

var A = function(){};

A.value = 'ABC';

// オブジェクト実装

var a = new A();

alert('value:'+a.value) // value:undefined

この場合の"A.value"はあくまで"A"のプロパティであって、new を用いてオブジェクトを生成した"a"には反映されないからです。このように、prototypeプロパティはオブジェクトを生成する際のプロトタイプ(原型)を作成する役割を果たしています。

プロトタイプチェーン

プロトタイプに代入したオブジェクトが別のプロトタイプに代入されているような場合があります。この場合プロトタイプは連鎖していく為、プロトタイプチェーンと呼ばれています。

var A = function(){};

A.prototype.value = 'ABC';

var a = new A();

var B = function(){};

B.prototype = a;

var b = new B();

alert('value:'+b.value) // value:ABC

変な例ですが、"b.value"は"B.prototype"を見にいき、"B.prototype"は"a"を見にいきます。更に"a"は"A.prototype"を見にいき、とうとう"value"を探し当てるわけです。


【トラックバック】

このエントリーのトラックバックURL: