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?
javascript
oop
inheritance
prototype-programming
Jonas Pegerfalk
quelle
quelle
Antworten:
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.
quelle
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.
quelle
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.
quelle
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).
quelle
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.
quelle
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.
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.
quelle
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
quelle