- 2008年8月18日 01:34
- プログラミング
-
単にオブジェクト指向といっても、大きく分けて「クラス・ベースのオブジェクト指向」と「プロトタイプ・ベースのオブジェクト指向」の2種類があるみたいです。
クラス・ベースのオブジェクト指向では,親クラスから子クラスを派生させる「継承」と,クラスからインスタンスを生成する「インスタンス化」は別の概念です。一方,プロトタイプにはこのような明確な区別はありません。プロトタイプから行う操作はいつでも「クローン」であり,「何にクローンするか」が違うだけです。プロトタイプからプロトタイプにクローンすればクラスの継承に近い機能になり,具体的なオブジェクトにクローンすればインスタンス化に近い機能になります。
Part3 JavaScriptに学ぶ「言語の拡張性」:ITpro
Javaに代表されるクラス・ベースのオブジェクト指向では、オブジェクトの型としてクラスという概念を用います。
クラスから継承やインスタンス化を行うといった操作はそれぞれ別の概念として明確に定義されています。
一方、JavaScriptに代表されるプロトタイプ・ベースのオブジェクト指向では、 オブジェクトの型としてプロトタイプという概念を用います。
プロトタイプから継承やインスタンス化を行うといった操作が個別に明確に定義されているわけではなく、両方の操作の意味を含む「クローン」という概念が定義されているだけのようです。
あと、クラス・ベースのオブジェクト指向とプロトタイプベースのオブジェクト指向の違いとして、拡張性が後者の方が高いという点が挙げられるみたいです。
クラスはメンバー(メソッドやフィールド)を動的に変更できないが,プロトタイプはプロパティ(関数などのオブジェクト)を自由に追加/削除できる
Part3 JavaScriptに学ぶ「言語の拡張性」:ITpro
つまり、クラスは一旦定義してしまうと後からそのメソッドやフィールドを追加・修正・削除することはできないのですが、プロトタイプは定義した後でもプログラムが動的にそのメソッドやフィールドを追加・修正・削除できるみたいです。
このような追加・修正・削除ができることを「言語の拡張性が高い」と表現するみたい。
一応、Javaにもクラスのメソッドやフィールドを動的に変更するJavassistというライブラリが存在します。
しかし、これはプログラムの実行中にクラスファイル自体を書き換えるという荒技を使ってクラス定義の動的変更を実現しているらしく、Javaの仕様にきれいに沿ったものであるとは言えません。
比較的コストも高そうです。
言語の仕様レベルでこういった「プログラム中からプログラムを操作する」ことが可能なプロトタイプベースのオブジェクト指向言語は非常に便利そうです。
Javascript以外にも他にどんなプロトタイプ・ベースのオブジェクト指向言語が存在するのか調べてみたいと思います。