[解決済み】プロトタイプベース継承とクラスベース継承の比較
質問
JavaScriptでは、すべてのオブジェクトはインスタンスであり、同時にクラスでもあります。継承を行うには、任意のオブジェクトのインスタンスをプロトタイプとして使用することができます。
PythonやC++などでは、クラスとインスタンスが別々の概念として存在します。継承を行うには、基底クラスを使って新しいクラスを作成し、そのクラスを使って派生インスタンスを生成する必要があります。
JavaScriptはなぜこのような方向性(プロトタイプベースのオブジェクト指向)になったのか、従来のクラスベースのOOに対するプロトタイプベースのOOの利点(と欠点)は何か。
どうやって解決するの?
ここには約100の用語の問題があり、そのほとんどは誰か(あなたではない)が自分のアイデアを「ベスト」と思わせようとしていることに起因しています。
すべてのオブジェクト指向言語は、いくつかの概念を扱うことができる必要があります。
- データメンバーとメンバー関数、あるいはデータとメソッドなど、さまざまな名前で知られているデータに対する操作とデータのカプセル化。
- 継承とは、これらのオブジェクトは、他のオブジェクトのセットと同じであることを示す能力である。
- ポリモーフィズム ("many shapes") は、オブジェクトがどのメソッドを実行するかを自ら決定するもので、リクエストを正しくルーティングするために言語に依存することができます。
さて、比較についてですが。
まず、「クラス」と「プロトタイプ」の違いについてです。 このアイデアはもともとSimulaで始まりました。クラスベースのメソッドでは、各クラスは同じ状態空間(「可能な値」とも言います)と同じ操作を共有するオブジェクトの集合を表し、それによって等価クラスを形成していました。 Smalltalkを振り返ると、クラスを開いてメソッドを追加することができるので、これは事実上Javascriptでできることと同じです。
その後のOO言語では、静的型チェックを使えるようにしたかったので、コンパイル時に固定されたクラスセットという概念が生まれました。 オープンクラス版では、より柔軟性があり、新しいバージョンでは、テストが必要だったいくつかの種類の正しさをコンパイラでチェックできるようになったのです。
クラスベースの言語では、コンパイル時にコピーが行われます。 プロトタイプ言語では、操作はプロトタイプのデータ構造に格納され、実行時にコピーされ変更されます。 しかし、抽象的には、クラスは、同じ状態空間とメソッドを共有するすべてのオブジェクトの等価クラスであることに変わりはない。 プロトタイプにメソッドを追加することは、事実上、新しい等価クラスの要素を作ることになるのです。
さて、なぜそうするかというと、主に実行時にシンプルで論理的でエレガントなメカニズムになるからです。 または 新しいクラスを作成するには、単にディープコピーを実行して、すべてのデータとプロトタイプのデータ構造をコピーする必要があります。 このとき、継承とポリモーフィズムはほぼ無償で手に入ります:メソッド検索 常に は、名前を指定してメソッドの実装を辞書に問い合わせることである。
Javascript/ECMAスクリプトに行き着いた理由は、基本的に、10年前にこの問題に着手したとき、私たちが扱うコンピュータはそれほど高性能ではなく、ブラウザもそれほど洗練されていなかったからです。 プロトタイプベースの方法を選択することで、オブジェクト指向の望ましい特性を維持しながら、インタプリタを非常にシンプルにすることができました。
関連
-
[解決済み】Uncaught ReferenceError。Firebase は定義されていません。
-
[解決済み】Babel NodeJS ES6: SyntaxError: 予期しないトークンのエクスポート
-
[解決済み] JavaScriptで要素のクラスを変更するにはどうすればよいですか?
-
[解決済み] Pythonで静的なクラス変数は可能ですか?
-
[解決済み] インターフェースと抽象クラスの違いは何ですか?
-
[解決済み] インターフェースと抽象クラス(一般的なOO)
-
[解決済み] 私的相続、公的相続、保護相続の違いについて
-
[解決済み] JavaScriptのオブジェクトのクラスを取得する方法は?
-
[解決済み] JavaScriptの "new "キーワードは有害とみなされるか?
-
[解決済み】AngularJSのスコーププロトタイピング/プロトタイピング継承のニュアンスとは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】React Js: Uncaught (in promise) SyntaxError: 位置 0 の JSON で予期しないトークン < が発生しました。
-
[解決済み】Failed to load resource: net::ERR_FILE_NOT_FOUND loading json.js
-
[解決済み】Uncaught TypeError: nullのプロパティ'value'を読み取ることができない
-
[解決済み】JavaScriptのisset()に相当するもの
-
[解決済み] React with ES7: Uncaught TypeError: Cannot read property 'state' of undefined [duplicate] (未定義のプロパティ'state'を読み込むことはできません。
-
[解決済み】コンソールがUnterminated JSX contentsエラーを投げる【終了しました
-
[解決済み】React、Uncaught ReferenceError。ReactDOMは定義されていません
-
[解決済み】npm install --legacy-peer-deps は具体的に何をするのですか?どんなときに推奨されるのか/どんな使用例が考えられるのか?
-
[解決済み】TypeError:res.jsonは関数ではありません。
-
[解決済み】プロトタイプ継承の利点は古典的なものよりも?