Was bedeutet es, dass Javascript eine prototypbasierte Sprache ist?

255

Einer der Hauptvorteile von Javascript soll sein, dass es sich um eine prototypbasierte Sprache handelt.

Aber was bedeutet es, dass Javascript auf Prototypen basiert und warum ist das ein Vorteil?

Jonas Pegerfalk
quelle
3
Diese Antwort erklärt alles, was Sie über die Vererbung von Prototypen wissen müssen: stackoverflow.com/a/16872315/783743
Aadit M Shah

Antworten:

291

Die prototypische Vererbung ist eine Form der objektorientierten Wiederverwendung von Code . Javascript ist eine der wenigen objektorientierten Sprachen, die prototypische Vererbung verwenden. Fast alle anderen objektorientierten Sprachen sind klassisch.

Bei der klassischen Vererbung schreibt der Programmierer eine Klasse, die ein Objekt definiert. Mehrere Objekte können aus derselben Klasse instanziiert werden, sodass Sie an einer Stelle Code haben, der mehrere Objekte in Ihrem Programm beschreibt. Klassen können dann in einer Hierarchie organisiert werden, um die Wiederverwendung von Code zu fördern. Allgemeinerer Code wird in einer übergeordneten Klasse gespeichert, von der niedrigere Klassen erben. Dies bedeutet, dass ein Objekt Code mit anderen Objekten derselben Klasse sowie mit seinen übergeordneten Klassen teilt.

In der prototypischen Vererbungsform erben Objekte direkt von anderen Objekten. Das ganze Geschäft mit dem Unterricht geht weg. Wenn Sie ein Objekt möchten, schreiben Sie einfach ein Objekt. Die Wiederverwendung von Code ist jedoch immer noch eine wertvolle Sache, sodass Objekte in einer Hierarchie miteinander verknüpft werden dürfen. In Javascript hat jedes Objekt eine geheime Verbindung zu dem Objekt, das es erstellt hat, und bildet eine Kette. Wenn ein Objekt nach einer Eigenschaft gefragt wird, die es nicht hat, wird sein übergeordnetes Objekt gefragt ... kontinuierlich die Kette hinauf, bis die Eigenschaft gefunden wird oder bis das Stammobjekt erreicht ist.

Jede Funktion in JavaScript (die selbst Objekte sind) hat tatsächlich ein Mitglied namens "Prototyp", das für die Bereitstellung von Werten verantwortlich ist, wenn ein Objekt nach ihnen gefragt wird. Mit diesem Element kann der Konstruktormechanismus (mit dem Objekte aus Funktionen erstellt werden) arbeiten. Durch Hinzufügen einer Eigenschaft zum Prototyp eines Funktionsobjekts wird diese sowohl für das erstellte Objekt als auch für alle von ihm geerbten Objekte verfügbar.

Vorteile

Es gibt möglicherweise keine feste Regel, warum die prototypische Vererbung eine vorteilhafte Form der Wiederverwendung von Code ist. Die Wiederverwendung von Code selbst ist vorteilhaft, und die Vererbung von Prototypen ist eine sinnvolle Vorgehensweise. Sie könnten argumentieren, dass die prototypische Vererbung ein ziemlich einfaches Modell für die Wiederverwendung von Code ist und dass Code auf direkte Weise stark wiederverwendet werden kann . Aber auch klassische Sprachen können dies erreichen.

Nebenbemerkung: @Andrew Hedges macht einen guten Punkt, dass es tatsächlich viele prototypische Sprachen gibt. Es ist erwähnenswert, dass diese anderen existieren, aber auch erwähnenswert, dass keiner von ihnen dem Mainstream nahe kommt. NewtonScript schien für eine Weile etwas Traktion zu haben, starb jedoch mit seiner Plattform. Es ist auch möglich, einige moderne Sprachen so zu erweitern, dass sie prototypische Funktionen hinzufügen.

Keparo
quelle
9
Hey Kelly. Während JavaScript bei weitem die beliebteste prototypische Sprache ist, gibt es viele andere: en.wikipedia.org/wiki/Prototype-based_programming#Languages
Andrew Hedges
2
Hey Andrew. Guter Punkt. Ich hätte klarer sein sollen. Ich werde es notieren.
Keparo
3
Bitte lesen Sie dies auch developer.mozilla.org/en/JavaScript/Guide/…
pramodc84
1
+1 für eine gute Antwort. Ein kleiner Kommentar: Für mich scheint die klassische Vererbung eher "direkt" als prototypisch zu sein. Tatsächlich sehe ich das Prototypobjekt wirklich als bloße Verknüpfung (mit anderen Objekten), während ich in einem kompilierten OOP die Basisklasse als "direkt vererbt" betrachte. Als solche werden prototypische Objekte eher miteinander verkettet als vererbt (Vererbung ist etwas gefälscht). Irgendwelche Gedanken?
Gefangener
3
@PrisonerZERO: Ich würde argumentieren, dass die prototypische Vererbung direkter als die klassische ist. Anstatt dass Objekt B auf eine Klasse zeigt, die von der Klasse erbt, auf die Objekt A zeigt, zeigt es direkt auf Objekt A und sagt "Ich bin genau wie dieses Objekt, außer ...". Das Große an der prototypischen Vererbung und das, was für die meisten Menschen am schwierigsten zu verinnerlichen scheint, ist, dass Instanzen nicht von Typen unterschieden werden. Jedes Objekt ist sowohl ein Typ als auch eine Instanz. Die Unterscheidung zwischen beiden ist künstlich und absichtlich und normalerweise ein Symptom dafür, dass man in einer klassenorientierten Denkweise steckt.
CHao
54

Eine prototypbasierte Sprache unterscheidet nicht zwischen Klassen und Objekten: Sie enthält lediglich Objekte. Eine prototypbasierte Sprache hat den Begriff eines prototypischen Objekts, eines Objekts, das als Vorlage verwendet wird, um die anfänglichen Eigenschaften für ein neues Objekt abzurufen. Jedes Objekt kann seine eigenen Eigenschaften angeben, entweder beim Erstellen oder zur Laufzeit. Darüber hinaus kann jedes Objekt als Prototyp für ein anderes Objekt zugeordnet werden , sodass das zweite Objekt die Eigenschaften des ersten Objekts gemeinsam nutzen kann.

Guido
quelle
6
Eine sehr gute Erklärung, aber ein wenig irreführend mit dem Kommentar zur "Vorlage für anfängliche Eigenschaften". Wenn Sie den Prototyp NACH dem Instanziieren eines Objekts ändern, erhält dieses Objekt weiterhin diese Funktionen.
Nickf
32

Prototypbasierte Programmierung ist ein Stil der objektorientierten Programmierung, bei dem keine Klassen vorhanden sind und die Wiederverwendung von Verhalten (oder die Vererbung in klassenbasierten Sprachen) durch Klonen vorhandener Objekte durchgeführt wird, die als Prototypen dienen.

CMS
quelle
Fühlst du dich immer noch so? Denn wenn ja, dann ist dies die erste Erklärung, die wirklich nur solide mit mir "klickt".
Chazt3n
11

Der Vorteil / Nachteil ist, dass wir zur Laufzeit neue Arten von Objekten erstellen können, ohne Klassen definieren zu müssen (statischer Code). Wie bei den meisten Funktionen ist es Sache des Entwicklers, dies zu einem Vorteil / Nachteil zu machen.

Oben ist möglich, weil Objekte im Wesentlichen Funktionen in Java-Skripten sind (auch Schließungen).

questzen
quelle
Dynamische Objekte sind ein Vorteil von Javascript, aber sie hängen nicht wirklich damit zusammen, dass Javascript eine prototypische oder funktionale Sprache ist. In vielen klassischen Sprachen können Sie zur Laufzeit dynamische Objekte erstellen. Verschlüsse haben auch etwas nichts miteinander zu tun.
Keparo
2
Klassen sind nicht unbedingt ein statischer Code - werfen Sie einen Blick auf Python, in dem Klassen selbst Objekte sind und aus Metaklassen bestehen, die auch Objekte sind.
Tomasz Zieliński
6

Anstatt eine Klassenstruktur zu deklarieren, können Sie Objekte desselben Typs erstellen und jederzeit mithilfe des Prototyps des Objekts zu ihrer Definition hinzufügen. Es ist flexibler als die normale Art, Dinge zu tun.

Greg
quelle
6

Wenn Sie zur Kompilierung nur Objekte zur Laufzeit anstelle einer Klasse zum Kompilieren verwenden, um neue Objekte zu erstellen, besteht die Möglichkeit, ein Objekt zu erweitern, ohne Details darüber zu kennen. Natürlich kann es je nach Verwendung ziemlich schnell zu einem Nachteil werden. Ich mache hier keine Annahmen über die Sprache, daher gilt sie für andere Sprachen als Javascript, die nicht so dynamisch sind.

myobject.prototype=unkownobject;
myobject.newproperty=1;

Sie können das Objekt von fast überall bekommen; Ihren eigenen Code, aus dem Netzwerk, aus der Datenbank, aus externen Verknüpfungen und so weiter.

Beachten Sie, dass eine Sprache keine Prototypvererbung wie Javascript implementieren muss. In Javascript wird ein Prototypobjekt lediglich gemeinsam mit seinen Erben geteilt, ebenso wie seine Eigenschaften. Die Alternative besteht darin, alle Eigenschaften des Prototyps in das neue Objekt zu kopieren. Jeder Ansatz hat seine Stärken in unterschiedlichen Situationen. Ich mag das zweite mehr, aber es ist nicht das, was Javascript macht.

künstlicher Idiot
quelle
6

Nachdem Sie alle Antworten gelesen haben, ist dies die Schlussfolgerung

1) Vererbung, bei der Objekte direkt von anderen Objekten geerbt werden

2) Das verwendet keine Klassen

3) Auch als instanzbasierte Programmierung oder klassenlose prototyporientierte Programmierung bezeichnet

4) Die Wiederverwendung des Verhaltens erfolgt durch Klonen vorhandener Objekte, die als Prototypen dienen

5) Objekt, das als Vorlage vom neuen Objekt verwendet wird, erhält anfängliche Eigenschaften

Sunil Garg
quelle