2016-04-09 10 views
0

先週私はクラスベースとプロトタイプ継承の違いを理解しようとしてきました。 PHPやJavaScriptを使って作業していたので、これをすばやく把握することができましたが、私はこれを念頭に置くことができません。古典継承とプロトタイプ継承の違いを理解する

私は、クラスはオブジェクトの特性を定義する青写真のようなものであることを学びました。クラスがインスタンス化されると、青写真に従ってオブジェクトが構築されます。継承が始まると、青写真は完全にしか採用できませんが、メソッドをオーバーライドできます。

しかし、プロトタイプとは何ですか? のように青写真ですが、すでに実装されています(したがって、「プロトタイプ」という名前)?だから継承では、既存の関数だけを指すことができますか?

次は愚かなように見えるかもしれませんが、私は物事を理解しようとしています。

より多くの人間の言葉では、クラスは、その計画に従ってインスタンス化された小さな労働者がオブジェクトを構築し始めるとすぐに、建築計画と見なすことができます。何かを継承するために、新しい詳細(既存の詳細を置き換える可能性がある)に加えて、完全な計画が再構築されます。

プロトタイプでは、代わりに作業者は既存のオブジェクトをコピーし、その主な特徴(プロトタイプと呼ばれるものに保存されている)を調べ始めます。他のオブジェクトから継承するには、「関数Xを探していますか?このようにしてください - オブジェクト間の隙間に気をつけてください」という看板をどこかに置くだけです。

この区別は正しいですか?

+1

[古典的な継承対protoypal継承のjavascript](http://stackoverflow.com/questions/19633762/classical-inheritance-vs-protoypal-inheritance-in-javascript) – Tushar

+0

https://stackoverflow.com/questions/ 34707632/classic-inheritance-and-prototype-in​​heritance – Bergi

+0

実際、プロトタイプの継承では、ワーカーは何もコピーしません。 – Bergi

答えて

2

あなたは実際にすでにポイントを得ているようです。

クラスベースのオブジェクト指向

すでに述べたように、(Javaなどの)クラスベースのオブジェクト指向言語ではクラスは、すべての将来のオブジェクトの青写真です。オブジェクトのインスタンス化のために、このオブジェクトに対して青写真(作成したクラス)がコピーされます。つまり、オブジェクトをインスタンス化した後にクラスを変更した場合、以前に作成されたオブジェクトには変更が反映されません。

継承について:クラスPersonがあるとしましょう。 Personから継承する別のクラスのStudentを作成したいとします。学生は、基本的に、青写真の機能を拡張することができる青写真Personのコピーです。あなたの例は非常に正確です! これは、複雑ではあるが静的なOO構造で非常に便利です! JavaScriptのような

プロトタイプベースの

プロトタイプベースの言語は、アプローチのこのテンプレートの種類に従いません。あなたの例はそれを再びかなりヒットしました。基本的には、オブジェクトを作成して、別のオブジェクト(プロトタイプ)を参照するだけです。プロトタイプに入れたすべての機能は、そのプロトタイプオブジェクトを参照するすべてのオブジェクトによって共有されます。ただし、青写真やテンプレートのコピーを作成しないことを理解することが重要です。あなたは常にオブジェクトで作業しています。

したがって、Personオブジェクトを作成できます。それはsayHelloのような方法を保持します。あなたが具体的な人物を作成した場合など。 Joeは別のオブジェクトを作成し、それをPersonオブジェクトにリンクします。ジョーを試してみると。sayHello()はJoeオブジェクトのプロパティを調べ、sayHelloメソッドが見つからないようにして、具体的なPersonオブジェクトにジャンプします。ちょうどあなたの例で言ったように。

実際には存在しないため、プロトタイプベースの言語で表現の継承が本当に好きではありません。青写真のコピーを作成したり、その機能を拡張したりすることはありません。継承は基本的にオブジェクトを連鎖させることで機能します。例えば上記の例。 Personオブジェクトを持つことができます。すべての通常の人物(例えば、ジョー)は、プロトタイプとして人物オブジェクトを有する。 Personをプロトタイプとして持つStudentオブジェクトを作成します。別のオブジェクト(例えば、StudentJoe)は、プロトタイプとしてスチューデントを持つことができます。したがって、メソッドにアクセスするためには、チェーンまで人を追うことができます。 短くしておく;):プロトタイプベースの言語は、青いプリントとテンプレートではなく、一緒にリンクされた(プロトタイプ)具体的なオブジェクトでのみ動作します。 このアプローチの利点は動的です(そのため、このアプローチはウェブで一般的に使用されています)。テンプレートではなく具体的​​なオブジェクトを扱うことはないので、プロトタイプチェーンのすべての変更は、いつでも(アクセス可能な機能の点で)あらゆるオブジェクトに影響を与えます。

私はこれが助けてくれることを願っています。あなたはJavaScriptを知らないといい本があります - この& JavaScriptを基にこのトピックを本当にうまく説明するオブジェクトプロトタイプ。

+0

これは本当に助けになった!ありがとう、私は今これまでよりずっと自信を持っています。 – Sven

+0

この説明は、無数のブログ記事、記事、Q&Aの中で際立っています。ありがとうございました。 – Magnus