これまで「JavaScriptはプロトタイプベースの言語」ということをチラチラと見ていたが、「そもそもプロトタイプベース」ってなんなん? って人に説明できるレベルになかったのでざっくりまとめてみる。
(後から追記ですがいろいろ脱線します)
また、現在のJavaScript界隈ではclass構文が毛嫌いされている節がある(と思っている)が、この傾向についても自分の中で腹落ちさせたい。
↑この記事内では諦めました。別で書きたい。
オブジェクト指向プログラミング(OOP)では、オブジェクトを扱います。オブジェクトを扱う以上は、オブジェクトを生成する必要があります。
しかし、オブジェクトの生成方式は、OOPで統一的な決まりはありません。言語によって異なるのです。言語によりオブジェクト生成の細部は異なりますが、生成方法は大きく分けて「クラスベース」と「プロトタイプベース」があります。
プロトタイプベース | TypeScript入門『サバイバルTypeScript』
プロトタイプベース (英: Prototype-based) は、オブジェクト指向プログラミング(OOP)のスタイルのひとつであり、オブジェクトの生成に既存オブジェクトの複製を用いるスタイルを指している。これには直後にメンバを拡充するための空オブジェクトの複製も含まれている。このスタイルは、インスタンスベース(Instance-based)とも呼ばれている。これと対比されるOOPスタイルにクラスベースがある。
プロトタイプベースOOPの原点はSmalltalk方言のSelfであり、Smalltalkのクラスベース設計を平易化する試みから1987年に誕生している。他にはLua、JavaScript、Etoys、ECMAScript、REBOL、Io、TypeScriptなどがある。
プロトタイプとは、複製元になったオブジェクトを意味しており、複製先のオブジェクトから見てそう呼ばれる。プロトタイプは同時にそのオブジェクトの暗黙の委譲先になり、これはプロトタイプを複製が継承していることと同じになる。
プロトタイプベースはプログラマに、オブジェクトをどう振る舞わせるかということのみに集中させて、オブジェクトが実際に振る舞えるかどうかの疑問を後回しにできる環境を提供する[3]。振る舞いとはメソッドである。
つまり、オブジェクト指向という大枠の中に「クラスベース」と「プロトタイプベース」があり、それぞれの流派に沿ってオブジェクトを生成する。
JavaScriptはプロトタイプベースであるものの、構文としてES6以降より「class」が用意されている。このclassはあくまで現代 (ES6の時点) において主流であったクラスベースのオブジェクト指向プログラミングに合わせて用意したものであって、JavaScript自体はclassベースではないためそれっぽく書けるもの (プロトタイプベースのシンタックスシュガー) である。