2016-01-10 12 views
6

ich diese Definition hier: https://medium.com/javascript-scene/10-interview-questions-every-javascript-developer-should-know-6fa6bdf5ad95#.y0nc8kx34Unterschied zwischen der klassischen und Prototypvererbung

Ist es nicht peinlich klingen für Sie? Macht diese Definition Sinn? Für mich gibt es in beiden Fällen einen Konstruktor (mit new kann man das zurückgegebene Objekt überschreiben) und in beiden Fällen gibt es eine Prototyp-Vererbung. Fehle ich etwas oder die obige Definition ist nicht wirklich genau?

* 3. Was ist der Unterschied zwischen klassischer Vererbung und prototypischer Vererbung?

Klassenvererbung: Instanzen erben von Klassen (wie ein Blueprint - eine Beschreibung der Klasse) und erstellen Unterklassenbeziehungen: hierarchische Klassentaxonomien. Instanzen werden typischerweise über Konstruktorfunktionen mit dem Schlüsselwort new instanziiert. Die Klassenvererbung kann das Schlüsselwort class von ES6 verwenden oder nicht.

Prototypische Vererbung: Instanzen erben direkt von anderen Objekten. Instanzen werden typischerweise über Factory-Funktionen oder Object.create() instanziiert. Instanzen können aus vielen verschiedenen Objekten zusammengesetzt werden, für eine einfache selektive Vererbung ermöglicht. *

+0

Das gar nicht richtig. Selbst wenn man die Syntax "class" in ES6 verwendet, ist es immer noch eine Prototyp-Vererbung. Der Unterschied besteht nicht in der verwendeten Deklarationssyntax, sondern darin, wie sie in der Praxis funktioniert. – jfriend00

+0

Nun, es heißt "typisch". Es gibt keine klassische Vererbung in JS, nur die Syntax, die die prototypische Vererbung verbirgt. – MinusFour

+0

Ich weiß richtig. Ich glaube, der Autor versteht nicht wirklich, wie JavaScript-Vererbung funktioniert und mischt es mit anderen typischen OO-Sprachkenntnissen, aber ich möchte sicher sein, dass ich nichts vermisse, bevor ich ihm die Schuld gebe. –

Antwort

3

In JavaScript ist Klassenvererbung auf der prototypische Vererbung implementiert, aber das bedeutet nicht, dass es die gleiche Sache tut:

Neben vererben Eigenschaften, Klassenvererbung nicht zusätzliche Verkabelung, das Kind verlinken [[Prototyp]] zum Eltern [[Prototyp]]. Normalerweise wird der super() Konstruktor auch aufgerufen. Diese zusätzlichen Schritte bilden Eltern-/Kindhierarchien und erstellen die engste verfügbare Kopplung im OO-Design.

Daher „erben Klassen von Klassen und Unterklasse Beziehungen erstellen. Hierarchische Klasse Taxonomien

Es ist auch nützlich zu verstehen, dass es mehr als eine Art von prototypal OO ist. Wichtig ist, gibt es konkatenative Vererbung und Prototyp Delegation.

Verkettungsvererbung ist wichtig, da dies die einfache (und sehr häufige) Objektkomposition in JavaScript ermöglicht. Erinnere dich daran, dass die Viererbande sagte: "Begünstige die Objektzusammensetzung über die Klassenvererbung."

Dies ist allgemein anerkannte OO Design Weisheit, und wegen der konkatenativen Vererbung ist es ein Kinderspiel, das in JavaScript zu tun.

Für viele weitere Details siehe "Master the JavaScript Interview: What's the Difference Between Class and Prototypal Inheritance?"

+0

Danke für die Antwort! Also, prototypische Vererbung erstellt keine Verbindung zum übergeordneten [[Prototyp]]? Und es bedeutet, dass ich keine tiefe Hierarchie von Klassen/Objekten mit Prototyp erstellen kann? –

+0

Was ist mit Erwähnung über semantischen Unterschied? Stimmen Sie meiner Antwort zu? –

+0

Verkettungsvererbung erstellt keine Hierarchie von Klassen/Objekten, nein. Es ist möglich, solche Hierarchien mit Prototypdelegierung zu erstellen, wie die Klassenvererbung in JavaScript implementiert ist. Ja, es gibt einen semantischen Unterschied zwischen Klasse und ja, ich stimme Ihrer Definition zu, mit der Einschränkung, dass ** 'Klasse' und Typen in JavaScript überhaupt nicht analog sind **.Programmierer erwarten, dass sie sind, was eine häufige Quelle der Verwirrung ist. –

4

Es gibt Schnittstelle und semantische Unterschiede zwischen „Klasse“ und „Prototyp“.

Schnittstelle Unterschied

Wie es in dem Code zu verwenden. Unterschied und Vorteile werden im Artikel gut erklärt.

Semantic Unterschied

Egal, wie es in JavaScript implementiert ist, können wir ES6-Klasse verwenden zu betonen, dass unsere Aufgabe, die „Klasse“, was bedeutet hat. Ursprünglich "Klasse" bedeutet, dass wir Klasse ify ein Objekt zu dem einen oder anderen Satz von Objekten können. Siehe Definition in der Mengenlehre: https://en.wikipedia.org/wiki/Class_(set_theory).

Auch ist Klasse etwas Abstraktes und existiert nicht, bevor wir eine Instanz erstellen.

Wenn wir über Klassenvererbung sprechen - es ist einfach zu verstehen, die Abstraktion, dass eine Klasse eine Unterklasse einer anderen Klasse sein kann, die Hierarchie erstellt.

Prototyp ist ein Beispiel oder ein repräsentatives Objekt aus einer Reihe von Objekten. In diesem Fall erstellen wir neue Objekte unter Verwendung des vorhandenen Prototyps (Klon oder Link erstellen). Und sie können auch Prototypen für neue Objekte sein.

Wenn andere Programmierer den Code lesen und sehen, was Sie sich entscheiden - Prototyp oder Klasse, erwarten sie diese semantische Bedeutung haben.

+0

'class' und Typen sind in JavaScript überhaupt nicht analog. Programmierer erwarten, dass sie sind, was eine häufige Quelle der Verwirrung ist. –

Verwandte Themen