ここには約100の用語の問題があり、そのほとんどは、自分のアイデアをThe Bestのように聞かせようとする誰か(あなたではない)を中心に構築されています。
すべてのオブジェクト指向言語は、いくつかの概念を処理できる必要があります。
- 特に、データメンバーおよびメンバー関数として、またはデータおよびメソッドとしてさまざまに知られている、データに関連する操作と共にデータのカプセル化。
- 継承、これらのオブジェクトはこれらの変更を除いて他のオブジェクトのセットと同じであると言う能力
- ポリモーフィズム(「多くの形状」)。実行するメソッドをオブジェクト自身が決定するため、言語に依存してリクエストを正しくルーティングできます。
さて、比較に関して:
まず最初に、「クラス」と「プロトタイプ」の質問全体を調べます。アイデアは当初Simulaで始まりました。クラスベースのメソッドでは、各クラスは同じ状態空間(「可能な値」を読み取る)と同じ操作を共有するオブジェクトのセットを表し、それによって等価クラスが形成されました。Smalltalkを振り返ってみると、クラスを開いてメソッドを追加できるため、これはJavaScriptでできることと実質的に同じです。
その後のオブジェクト指向言語は静的型チェックを使用できるようにしたかったので、コンパイル時に固定クラスセットの概念を取得しました。オープンクラスバージョンでは、柔軟性が向上しました。新しいバージョンでは、そうでなければテストが必要であったコンパイラで、ある種の正しさをチェックする機能がありました。
「クラスベース」の言語では、そのコピーはコンパイル時に行われます。プロトタイプ言語では、操作はプロトタイプデータ構造に格納され、実行時にコピーおよび変更されます。ただし、抽象的には、クラスは同じ状態空間とメソッドを共有するすべてのオブジェクトの同等クラスです。プロトタイプにメソッドを追加すると、効果的に新しい等価クラスの要素が作成されます。
さて、なぜそれをするのですか?これは主に、実行時にシンプルで論理的でエレガントなメカニズムを実現するためです。新しいオブジェクトを作成したり、新しいクラスを作成したりするには、ディープコピーを実行し、すべてのデータとプロトタイプデータ構造をコピーするだけです。継承とポリモーフィズムは多かれ少なかれ無料で得られます:メソッド検索は常に名前でメソッド実装のための辞書を要求することから成ります。
Javascript / ECMAスクリプトに終わった理由は、基本的に、10年前にこれを使い始めたときに、はるかに強力ではないコンピューターとはるかに洗練されていないブラウザーを扱っていたからです。プロトタイプベースの方法を選択すると、オブジェクトの向きの望ましいプロパティを維持しながら、インタープリターを非常にシンプルにすることができます。