スクリプト言語とその出生
一般に普及しているスクリプト言語はたいていC言語系なわけですが、多くはその出生を巧妙に隠しています。
例えば皆の知っているPerlはシェルスクリプトの流れを受けていますし、RubyはSmalltalkの流れを強くうけています。(他にもCLUなどからも影響を受けていると聞くものの、その辺はわたしはしらない)(CLUについてはるびま9号に記事が載る予定です)
で、JavaScriptはプロトタイプベース オブジェクト指向の流れを受けています。プロトタイプベースのルーツはSELFにあるらしいのですが、あいにくとわたしは触ったことはないです。クラスベースとプロトタイプベースとの違いを大雑把に言えば、クラスベースではクラスとインスタンスに分かれているものが、プロトタイプベースでは両者ともオブジェクトなのです。
クラスベースにおいてはインスタンスはその全てを従属するクラスによって決められます。しかし、プロトタイプベースにおいては、プロトタイプがオブジェクトの原型を決めます。
しかし、決められるのは原型のみであって、そのオブジェクトは独自のメソッドやプロパティを持つことが出来る。これによって例えば以下のようなことができます。
function Hoge(x,y){ this.x = x; this.y = y; } Hoge.prototype.x = function(){ return this.x }; Hoge.prototype.y = function(){ return this.y }; hoge = new Hoge(1,2); print("hoge.x : " + hoge.x); print("hoge.y : " + hoge.y); fuga = new Hoge(2,3); print("fuga.x : " + fuga.x); print("fuga.y : " + fuga.y); fuga.xPlusY = function(){ return this.x + this.y; } print("fuga.x + fuga.y : " + fuga.xPlusY()); // print("fuga.x + fuga.y : " + fuga.xPlusY()); // => error
たとえばこんな感じ。
なお、JavaScriptがプロトタイプベースとしても異端なのは、
ここにあるHoge.prototypeが、Hoge自身のでなく、
Hogeの‘インスタンス’のprototypeであること。
Hoge自身のprototypeは、ECMAScriptでは内部プロパティ[[Proto]]として定義されており、
基本的にはアクセスできない。
これがアクセスできるとおもしろかったと思うのですが、
アクセスできないから、ECMAScript Edition 4 / JavaScript2.0 / JScript.NETは、
クラスベースに転生できたわけなのですよね。
比較的手軽にいじれるプロトタイプベースな言語としては、
IoLanguageとかがいいのではないでしょうか。
プロトタイプベース・オブジェクト指向からたどれる範囲が、
プロトタイプベースについてはまとまっているかと。