JavaScript の継承がどのように機能するかを説明する記事や投稿はたくさんありますが、なぜ JavaScript は従来の継承ではなくプロトタイプの継承を使用して実装されたのでしょうか?
私は JavaScript が大好きなので、それが悪いと言っているわけではありません...ただ興味があるだけです。
JavaScript の継承がどのように機能するかを説明する記事や投稿はたくさんありますが、なぜ JavaScript は従来の継承ではなくプロトタイプの継承を使用して実装されたのでしょうか?
私は JavaScript が大好きなので、それが悪いと言っているわけではありません...ただ興味があるだけです。
何が起こったのかについて、ブレンダン・アイヒは次のように述べています: https://brendaneich.com/2008/04/popularity/
私がよく言っているように、また Netscape の他の人たちも確認しているように、私はブラウザで「Scheme を実行する」という約束で Netscape に採用されました。少なくとも、Tom Paquin、Michael Toy、Rick Schell などのクライアントのエンジニアリング管理者と、Marc Andreessen という名前の人物は、Netscape がプログラミング言語をソース形式で HTML に埋め込むべきだと確信していました。
上層部の技術管理者からの指示は、言語は「Java のように見える」ものでなければならないというものでした。そのため、Scheme とともに、Perl、Python、および Tcl は除外されました。
誇りに思っているわけではありませんが、Scheme っぽいファーストクラスの関数と Self っぽい (特異ではありますが) プロトタイプを主な構成要素として選んだことをうれしく思います。Java の影響、特に y2k Date のバグだけでなく、プリミティブとオブジェクトの区別 (文字列と文字列など) も残念でした。
JavaScript はもともと Lisp に非常によく似ていると考えられていました。構文が C/Java により近いものに変更された後でも、C の服を着た Lisp のままです。答えは関数型プログラミングの起源にあると思います。純粋な FP では、変更可能な状態はありません。つまり、変更可能なオブジェクトはありません。ルールを少し緩めて少し工夫すると、典型的な継承のようなものになってしまいます。つまり、オブジェクトを拡張することはできますが、元のオブジェクトを変更することはできません。それは継承と同じ力を提供し、それでもいくらかの不変性を提供します。
最後に、言語をひねって C++ と Java のように見せ、viola を作成しますnew someFunction()
。残りは歴史です。
セルフの影響を強く受けていたからです。ウィキペディアと ECMA 仕様の両方がこれに言及しています。
実装が簡単で、余分なキーワードを必要とせず、ユーザーが言語を使用するために言語を理解する必要がないため、この言語が選択されたと思います。また、クラスベースの継承よりも強力で柔軟です。
これは、型指定されていない言語の自然な選択です。クラスベースの継承の主な利点は、静的な型付けが可能であるため、型チェックとテーブルベースのルックアップの実装が高速になることです。
プロトタイプの継承 (クロージャーを使用) により、他の人は思いもよらなかったことを行うことができます。これは、汎用プログラミングを実現するために集まったいくつかのパラダイムのメッシュです。
プロトタイプ言語を使用すると、クラスに「ミックスイン」を作成できます。言語固有のキーワードを使用せずに、必要なレベルのカプセル化を実現できます。要するに、プロトタイプ言語は素晴らしいです。
言いたくないのですが、JavaScript といくつかのライブラリがあれば、必要なことはすべて実行できます。その開発は破壊的でした (Java に従属していると思われます)。最も単純な実装では、非常に強力です。
十分に勉強したり遊んだりすることで、そのインスピレーションの利点が見えてきます。JavaScript は、潜在的な可能性を意図的に「隠した」数少ない言語の 1 つです。「なぜ」を知りたければ、政治に参加しなければなりません。しかし、これが素晴らしいのはこのためです。