プロトタイプベース
プロトタイプベース (英: prototype-based) は、オブジェクト指向言語と総称されるプログラミング言語のうち、プロトタイプを基礎(ベース)としてオブジェクトを取り扱うものをいう。インスタンスベースとも。一方、クラスに基づいたオブジェクトインスタンスの生成を行う方式のものをクラスベースと呼ぶ。
クラスベースのオブジェクト指向言語が委譲をクラスの継承関係にもとづいて行うのに対し、プロトタイプベースのオブジェクト指向言語は、委譲を「プロトタイプ」と呼ぶ既存のオブジェクトに投げる、といったようにして行う点が特徴である。そのために例えば、新しいオブジェクトを作る際には、「クラスのインスタンスを作る」のではなく、「既存のオブジェクト(プロトタイプ)のクローンを作る」というようなスタイルになる。Smalltalkを元にクラスの複雑性を排除したSelfが特に有名[要出典]である。他にJavaScript、NewtonScript、Lua、Ioなどがプロトタイプベース(またはその機能を持つ)と考えられる。
なおオブジェクト指向のスタイルとして、ビャーネ・ストロヴストルップのC++流と、アラン・ケイのSmalltalk流という分類がなされることもある。前者は由来となったSimulaのクラスを強く受け継いだものであり、C++から派生したJavaやC#などの大多数のオブジェクト指向言語にも受け継がれている。後者はアラン・ケイの提唱したメッセージパッシングの概念に基づくものであり、Smalltalkの他にも、Objective-CやRubyなど、ある程度動的性を有し、かつ、コールしたメソッドが存在しない時にメソッドコール情報をメッセージとしてハンドリング可能とするフォールバック機構を有する言語にその精神が受け継がれている。
特徴
クラス = 構造化されたデータ + それに所属するメソッド、という考え方はプログラムの整理に劇的な威力を発揮する。しかし、全てがクラスベースであるという前提は時に物事を複雑化してしまう。
問題となるのはクラスが静的な構造と結びついているという点である。
例えばメソッドが必ず何らかのクラスに所属するという前提は強すぎる場合がある。クラスベースでは委譲や代理(プロキシ)によって動作にバリエーションを与えるが、初めからバリエーションをもったインスタンスを作成できればそのような機構は必要ない。
またインスタンス変数とメソッドの違いとは何か、という問題もある。C++やJavaのpublicなメンバ変数(フィールド)などを別にすれば、インスタンス変数とアクセサメソッドはほとんど等価の概念である。
そこでプロトタイプベースでは、全てのオブジェクトをスロットなどと呼ばれる、アクセス名と結びついた汎用の変数領域の塊でできた可変構造体として捉え直し、そこに他のオブジェクトへの参照やメソッドなどを自由に定義できるようにする。つまりオブジェクトは参照とメソッドの集積体であり、いかなる静的構造とも結びつかない。
クラスが存在しない世界ではテンプレート処理によるインスタンス化ができないため、新しいオブジェクトは完全に空の状態か、または他のオブジェクトの複製(クローン)によって作成される。プロトタイプベースでの継承は一般にこのクローンによる特性の引き継ぎを指す。