Der Unterschied zwischen einer klassenbasierten Sprache (wie Java oder Python) und einer prototypbasierten Sprache (wie Javascript)? [Duplikat]

8

Diese Frage kam neulich bei der Arbeit auf - was ist der Unterschied zwischen einer klassenbasierten Sprache wie Python und einer prototypbasierten Sprache wie Javascript? Abgesehen von unterschiedlichen Ansätzen, scheinen beide Wege sehr ähnlich zu sein und wir haben darum gekämpft, etwas zu finden, das eine klassenbasierte Sprache tun könnte, was eine prototypbasierte Sprache nicht könnte oder umgekehrt.

Kann jemand näher darauf eingehen, wie sie sich grundsätzlich unterscheiden?

Ich habe nicht viel online über die Unterschiede gefunden, nur Seiten, die Ihnen zeigen, wie man mit dem anderen fertig wird (zB: Simulieren von Klassen mit Prototypen in JavaScript )

Jede Aufklärung geschätzt!

    
Ben 23.07.2012, 21:11
quelle

4 Antworten

3

Es scheint so, als ob Sie mit den tatsächlichen Sprachen vertraut sind, also wissen Sie, was der Unterschied ist, richtig? Ich denke, du fragst nach den Unterschieden auf einer tieferen, vielleicht "philosophischeren" Ebene.

Klassenbasierte Sprachen tendieren dazu, von oben nach unten, von allgemein zu speziell, zu arbeiten. Das klassische Beispiel wäre, dass Sie eine "Vehicle" -Klasse und dann Unterklassen wie "Car", "Train" definieren.

Eine prototypbasierte Sprache würde stattdessen dazu neigen, mit dem Besonderen zu beginnen, in der Tat mit einer Instanz des Besonderen zu beginnen und diese zu modifizieren.

Ich mag das: Ссылка

Am Ende ist es keine Frage, ob Sie in JS Vererbung machen können oder ob es etwas gibt, was Sie in einer Sprache tun können, aber nicht in der anderen. Es ist ein tiefer Unterschied in ihren Wegen, sich der Problemlösung zu nähern. Für ein bestimmtes Problem würde eine gute idiomatische Lösung, die die Funktionen der Sprache am besten nutzt, in einer prototypbasierten Sprache von einer in einer klassenbasierten Sprache ziemlich unterschiedlich sein.

    
scytale 23.07.2012, 21:22
quelle
6

Lesen Sie diesen Artikel . Es ist ein ausführlicher Artikel, der die Unterschiede zwischen klassenbasierten und prototypbasierten Sprachen diskutiert.

Kopie der Tabelle, die die Unterschiede zusammenfasst:

Klassenbasiert (Java)

  • Klasse und Instanz sind unterschiedliche Entitäten.
  • Definieren Sie eine Klasse mit einer Klassendefinition; instanziieren Sie eine Klasse mit Konstruktormethoden.
  • Erstellen Sie ein einzelnes Objekt mit dem neuen Operator.
  • Erstellen Sie eine Objekthierarchie, indem Sie mithilfe von Klassendefinitionen Unterklassen vorhandener Klassen definieren.
  • Vererben Sie Eigenschaften, indem Sie der Klassenkette folgen.
  • Klassendefinition spezifiziert alle Eigenschaften aller Instanzen einer Klasse. Eigenschaften können zur Laufzeit nicht dynamisch hinzugefügt werden.

Prototyp-basiert (JavaScript)

  • Alle Objekte sind Instanzen.
  • Definieren und erstellen Sie eine Reihe von Objekten mit Konstruktorfunktionen.
  • Gleiches.
  • Konstruieren Sie eine Objekthierarchie, indem Sie ein Objekt als Prototyp einer Konstruktorfunktion zuordnen.
  • Vererben Sie Eigenschaften, indem Sie der Prototypkette folgen.
  • Konstruktorfunktion oder Prototyp gibt eine erste Menge von Eigenschaften an. Kann Eigenschaften dynamisch einzelnen Objekten oder dem gesamten Objektsatz hinzufügen oder entfernen.
jeff 23.07.2012 21:20
quelle
1

Der JavaScript-Leitfaden von MDN hat einige gute Punkte, werfen Sie einen Blick darauf: Ссылка

    
davidbuzatto 23.07.2012 21:16
quelle
0

Nun, sie drehen sich beide (normalerweise) komplett. :)

Bei den Klassen geht es darum, die Kapselung zu erzwingen, auf Kosten einer Laufzeitverlängerung (oder einer großen Laufzeit). Prototypen fördern die Kapselung und ermöglichen eine nahezu unbegrenzte Laufzeitverlängerung.

Im Ernst, prototyp-basierte OO macht es sehr einfach - einige würden gefährlich einfach sagen - sich dynamisch von einem Objekt zu erweitern / abzuleiten. Prototypsprachen existieren daher nicht einfach mit der statischen Typisierung. Also, wenn Sie mögen, wie Compiler Typfehler abfangen, werden Sie beinahe prototypbasierte Sprachen ausschließen.

Es gibt tatsächlich eine sehr gute Diskussion hier: Ссылка obwohl es auch andere gibt sind genauso gut, dass ich das mochte.

    
Carlos 23.07.2012 21:22
quelle

Tags und Links