11

重複の可能性:
プロトタイプ ベースとクラス ベースの継承

この質問は先日職場で持ち上がりました。Python のようなクラスベースの言語と Javascript のようなプロトタイプベースの言語の違いは何ですか? アプローチが異なることを除けば、どちらの方法も非常に似ているように見えます。クラスベースの言語ではできてプロトタイプベースの言語ではできないこと、またはその逆を見つけるのに苦労しました。

それらが根本的にどのように異なるかについて、誰か詳しく説明したり、詳細に説明したりできますか?

違いについてはオンラインであまり見つけていません。一方を他方で達成する方法を示すサイトだけです (このような: JavaScript でプロトタイプを使用してクラスをシミュレートする)

どんな啓発も大歓迎です!

4

4 に答える 4

6

この記事をチェックしてください。クラスベース言語とプロトタイプベース言語の違いについて詳しく説明した記事です。

違いをまとめた表のコピー:

クラスベース (Java)

  • クラスとインスタンスは別個のエンティティです。
  • クラス定義でクラスを定義します。コンストラクター メソッドでクラスをインスタンス化します。
  • new 演算子を使用して単一のオブジェクトを作成します。
  • クラス定義を使用して既存のクラスのサブクラスを定義することにより、オブジェクト階層を構築します。
  • クラス チェーンに従ってプロパティを継承します。
  • クラス定義は、クラスのすべてのインスタンスのすべてのプロパティを指定します。実行時にプロパティを動的に追加できません。

プロトタイプベース (JavaScript)

  • すべてのオブジェクトはインスタンスです。
  • コンストラクター関数を使用して一連のオブジェクトを定義および作成します。
  • 同じ。
  • コンストラクター関数に関連付けられたプロトタイプとしてオブジェクトを割り当てることにより、オブジェクト階層を構築します。
  • プロトタイプ チェーンに従ってプロパティを継承します。
  • コンストラクター関数またはプロトタイプは、プロパティの初期セットを指定します。個々のオブジェクトまたはオブジェクトのセット全体に対して、プロパティを動的に追加または削除できます。
于 2012-07-23T21:20:27.550 に答える
5

実際の言語に慣れているようで、違いがわかりますよね?より深い、おそらくより「哲学的な」レベルでの違いについて質問していると思います。

クラスベースの言語は、一般的なものから特定のものまで、トップダウンで機能する傾向があります。典型的な例は、'Vehicle' クラスを定義してから、'Car'、'Train' などのサブクラスを定義する場合です。

プロトタイプベースの言語は、代わりに特定のものから始まる傾向があり、実際には特定のもののインスタンスから始まり、それを変更します。

私はこれが好きです: http://steve-yegge.blogspot.ie/2008/10/universal-design-pattern.html

結局のところ、JS で継承ができるかどうか、ある言語ではできるが別の言語ではできないことがあるかどうかは問題ではありません。これは、問題解決へのアプローチ方法に大きな違いがあります。特定の問題について、言語の機能を最大限に活用した優れた慣用的なソリューションは、プロトタイプベースの言語とクラスベースの言語ではおそらくまったく異なるでしょう。

于 2012-07-23T21:22:25.783 に答える
1

MDN の JavaScript ガイドにはいくつかの良い点があります

于 2012-07-23T21:16:44.680 に答える
0

まあ、どちらも (通常は) Turning Complete です。:)

クラスは、一部 (または多く) の実行時の拡張性を犠牲にして、カプセル化を強制することに関するものです。プロトタイプはカプセル化を促進し、ほぼ無制限のランタイム拡張を可能にします。

真剣に、プロトタイプベースのオブジェクト指向は、オブジェクトから動的に拡張/派生することを非常に簡単にします (危険なほど簡単だと言う人もいます)。したがって、プロトタイプ言語は静的型付けと簡単には共存できません。したがって、コンパイラが型エラーをキャッチする方法が気に入った場合は、ほぼ確実にプロトタイプ ベースの言語を除外することになります。

ここには実際に非常に良い議論があります: http://yehudakatz.com/2011/08/12/understanding-prototypes-in-javascript/私が気に入ったのと同じくらい良いものは他にもあります。

于 2012-07-23T21:22:43.977 に答える