クラスベースとプロトタイプベース

JavaScript勉強中です。クラスベースのオブジェクト指向と、プロトタイプベースのオブジェクト指向の違い、自分なりの解釈をまとめておきます。

違いは何?

一般的にオブジェクト指向というと、クラスベースのものを指すようです。例えばJavaがこちらに相当します。これに対して、JavaScriptではプロトタイプベースのオブジェクト指向を採用しています。では、この二つの違いはなんなのでしょうか。

まずクラスベースでは、すべてのオブジェクトはクラス(設計図)から生成されます。そしてクラスからオブジェクトを作る作業をインスタンス化と呼びます。また、このときに作られるオブジェクトをインスタンスとも呼びます。次にプロトタイプベースのオブジェクト指向について考えてみます。プロトタイプベースな言語、JavaScriptでは、実はクラスと呼ばれるものはありません。ここでクラスという概念のポイントを考えてみます。クラスベースは、設計図(クラス)を基にして、オブジェクトを作ります。要するにテンプレートがあればいい訳です。プロトタイプベースな言語、JavaScriptでは、クラスの代わりに、プロトタイプオブジェクトがこの設計図の働きをします。

クラスベースの場合、すべてのオブジェクトはクラス(設計図)から生成されました。これに対して、プロトタイプベースの場合、すべてのオブジェクトは既存のオブジェクトから作られます。この新しいオブジェクトを作る際に、元にした既存のオブジェクトのことをプロトタイプオブジェクトと呼びます。また、プロトタイプオブジェクトへの参照は、鎖のように繋がっていることから、プロトタイプチェーンと呼びます。では、プロトタイプオブジェクトとは、普通のオブジェクトと違う、特殊なオブジェクトなのでしょうか?答えとしては、そうではありません。プロトタイプ、要するに設計図にされたオブジェクトのことを、プロトタイプオブジェクトと呼んでいるにすぎません。またプロトタイプチェーンも特別なものではなく、全てのオブジェクトはプロトタイプへの参照を持っています。
プロトタイプベースの場合、クラスという概念が無いという話を上でしました。これは普通のオブジェクトでも、プロトタイプオブジェクトとして、クラスのように振舞うことができるからなのです。

何がいいの?

クラスベースの場合、オブジェクトの設計図としてクラスを利用していました。しかし、クラスの定義は一度しかできません。後からクラスに対して、新しいフィールド(変数)やメソッドを付け加えることができないのです。つまり、クラスとは静的なものなのです。これに対して、プロトタイプベースの場合、設計図には、プロトタイプオブジェクトを利用しています。クラスは変更の利かない静的なものですが、オブジェクトとは動的なものです。そのため、後からでも設計図を変更することができます。これが大きな違いです。
プロトタイプベースは、後からでも設計図を変更できる。クラスベースは、後から設計図を変更できない。ではこう考えてみてはどうでしょうか。プロトタイプベースのオブジェクト指向があったとして、そこに後から設計図を変更できないように制約を設けたのが、クラスベースのオブジェクト指向である。