prototypbasierte vs. klassenbasierte Vererbung
In JavaScript, jedes Objekt ist gleichzeitig eine Instanz oder eine Klasse. Zu tun, Vererbung, Sie können jedes Objekt Instanz als Prototyp.
In Python, C++, etc.. es gibt Klassen und Instanzen als separate Konzepte. Um die Vererbung zu tun, müssen Sie die Basisklasse eine neue Klasse erstellen, die dann verwendet werden können, zu produzieren abgeleiteten Instanzen.
Warum haben JavaScript in diese Richtung zu gehen (Prototyp-basierte Objektorientierung)? was sind die Vorteile (und Nachteile) des Prototypen-basierte OO mit Bezug auf die traditionellen, klassenbasierten OO?
Kommentar zu dem Problem
JavaScript wurde beeinflusst von Selbst, das war die erste Sprache, mit prototypal inheritance. Damals klassische Erbe war all die Wut, die erstmals in Simula. Aber klassische Vererbung zu kompliziert war. Dann David Ungar und Randall Smith hatte eine Epiphanie nach dem Lesen GEB - "Die meisten bestimmtes Ereignis dienen kann, als ein Allgemeines Beispiel für eine Klasse von Ereignissen." Sie realisiert, dass die Klassen sind nicht erforderlich für die Objekt-orientierte Programmierung. Also Selbst geboren wurde. Zu wissen, wie prototypal inheritance ist besser als die klassische Vererbung Lesen Sie diese: stackoverflow.com/a/16872315/783743 =)
Danke für die Nachfrage eine interessante Frage und für die Einführung von it in einer Weise, die funktioniert bei mir schon als Antwort 🙂
@AaditMShah Was/wer ist
GEB
? @Alex GEB, ist ein Buch von Douglas Hofstadter. Es ist eine Abkürzung von " Gödel-Escher-Bach. Kurt Gödel war Mathematiker. Escher war ein Künstler. Bach war ein pianist.
InformationsquelleAutor der Frage Stefano Borini | 2009-05-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es über hundert Fragen der Terminologie, die hier, meist gebaut, um jemand (nicht du) versucht, Ihre Idee Klang am Besten gefällt.
Alle Objekt-orientierten Sprachen müssen in der Lage, sich mit mehreren Konzepten:
Nun, so weit als Vergleich:
Erste Sache ist, die ganze "Klasse" vs "Prototyp" in Frage. Die Idee, die ursprünglich begann in Simula, wo mit einer Klasse-Methode, jede Klasse repräsentiert eine Menge von Objekten, die gemeinsam die gleiche Zustandsraum (Lesen Sie "mögliche Werte") und die gleichen Operationen, so bildet sich eine äquivalenz-Klasse. Wenn Sie zurückblicken auf Smalltalk, da kann man eine Klasse und hinzufügen von Methoden, das ist effektiv das gleiche wie das, was Sie tun können, in Javascript.
Später OO-Sprachen in der Lage sein wollten, verwenden die statische Typ-Prüfung, so dass wir die Vorstellung von einer festen Klasse zur Kompilierzeit festgelegt. In der open-class-version, die Sie mehr Flexibilität; in der neueren version, Sie hatte die Fähigkeit, einige Arten von correctness an den compiler, dass der ansonsten erforderlichen Prüfung.
In einem "class-based" - Sprache, die das kopieren geschieht bei der Kompilierung. In einer Prototyp-Sprache, die Vorgänge gespeichert werden, die in den Prototyp der Struktur der Daten, die kopiert und verändert im Lauf der Zeit. Abstrakt, obwohl eine Klasse ist immer noch die äquivalenz-Klasse aller Objekte, die die gleichen Zustandsraum und Methoden. Wenn Sie eine Methode hinzufügen, der Prototyp, du bist effektiv machen ein element einer neuen äquivalenzklasse.
Nun, warum tun Sie das? vor allem, weil es macht für eine einfache, logische, elegante Mechanismus, der zur Laufzeit. nun, ein neues Objekt zu erstellen, oder eine neue Klasse erstellen, müssen Sie einfach führen Sie eine Tiefe Kopie, kopieren Sie alle Daten und die Prototyp-Daten-Struktur. Erhalten Sie Vererbung und Polymorphie mehr oder weniger kostenlos dann: Methode lookup immer besteht aus Fragen, ein Wörterbuch für eine Methode, die Umsetzung von Namen.
Dem Grund, dass endete in Javascript/ECMA-Skript ist im Grunde, dass, wenn wir waren erste Schritte mit vor 10 Jahren, waren wir im Umgang mit weniger leistungsfähigen Computern und noch viel weniger anspruchsvolle Browser. Die Auswahl der Prototyp-basierten Methode gemeint, der interpreter könnte sehr einfach sein, unter Beibehaltung der wünschenswerten Eigenschaften der Objektorientierung.
InformationsquelleAutor der Antwort Charlie Martin
Einen Vergleich, der etwas voreingenommen in Richtung der Prototypen-basierte Ansatz könnte in der Papier - Selbst: Die Kraft der Einfachheit. Das Papier macht die folgenden Argumente zu Gunsten von Prototypen:
Erstellung durch kopieren. Erstellen neuer Objekte aus Prototypen wird erreicht, indem
eine einfache Bedienung, kopieren, mit einem einfachen biologischen Metapher, Klonen. Erstellen
neue Objekte von Klassen erfolgt durch Instanziierung, die auch die
interpretation der format-Informationen in einer Klasse. Die Instanziierung ist
ähnlich wie ein Haus zu bauen aus einem plan. Kopieren spricht uns als eine einfachere Metapher
als Instanziierung.
Beispiele von bereits vorhandenen Module. Prototypen sind konkreter als Klassen
denn Sie sind Beispiele für Objekte, die eher als Beschreibungen von Dateiformat und-Initialisierung.
Diese Beispiele können helfen, die Benutzer, um die Wiederverwendung von Modulen durch, wodurch Sie leichter zu
verstehen. Eine Prototyp-basierte system ermöglicht es dem Benutzer zu prüfen, ein typischer Vertreter
es ist nicht erforderlich, ihm einen Sinn zu seiner Beschreibung.
Unterstützung für one-of-a-Kind-Objekte. Selbst bietet einen Rahmen, der leicht
gehören one-of-a-Kind-Objekte mit Ihrem eigenen Verhalten. Da jedes Objekt hat
benannte slots und slots hold-Zustand oder ein Verhalten, jedes Objekt kann eigene slots
oder Verhalten. Klasse-basierte Systeme sind ausgelegt für Situationen, in denen
es gibt viele Objekte mit dem gleichen Verhalten. Es gibt keine sprachliche Unterstützung für ein
Objekt zu besitzen, seine eigenen einzigartigen Verhalten, und es ist umständlich (denke Singleton-Muster), eine Klasse zu erstellen, der garantiert, dass nur eine Instanz. Selbst leidet unter keiner dieser Nachteile.
Jedes Objekt kann individuell angepasst werden mit Ihrem eigenen Verhalten. Ein einzigartiges Objekt kann
halten Sie das einzigartige Verhalten, und eine eigene "Instanz" ist nicht erforderlich.
Beseitigung von meta-Regressionen. Kein Objekt in einer Klasse-basierten system kann autark sein;
einem anderen Objekt (seiner Klasse) wird gebraucht, um auszudrücken, seine Struktur und Verhalten.
Dies führt zu einer konzeptionell unendliche meta-Regression: eine
point
eine Instanz der KlassePoint
eine Instanz der MetaklassePoint
eine Instanz von metametaclassPoint
ad infinitum. Auf der anderen Seite, in Prototyp-basierten Systemen ein Objektkann eigene Verhalten; kein anderes Objekt benötigt wird, Leben einzuhauchen. Prototypen
beseitigen meta-regress.
Selbst ist wohl die erste Sprache, die zur Implementierung von Prototypen. (Auch Pionierarbeit weitere interessante Technologien wie JIT, die später seinen Weg in die JVM. So Lesen die anderen Self-Papiere sollte auch lehrreich sein).
InformationsquelleAutor der Antwort Vijay Mathew
Sollten Sie sich großartiges Buch über JavaScript von Douglas Crockford. Es bietet eine sehr gute Erklärung, die einige der design-Entscheidungen, die von JavaScript-Macher.
Einer der wichtigsten design-Aspekt von JavaScript ist die prototypal inheritance system. Objekte sind erste Klasse Bürger in JavaScript, so viel, dass reguläre Funktionen sind implementiert und Objekte ('Funktion' Objekt um genau zu sein). Meiner Meinung nach, wenn es wurde ursprünglich entwickelt, um laufen in einem browser, es gemeint war, verwendet werden, um viele der singleton-Objekte. Im browser-DOM, finden Sie, dass Fenster, Dokument, etc alle singleton-Objekte. Auch JavaScript ist schwach typisierte, dynamische Sprache (im Gegensatz zu sagen, Python ist stark typisiert, dynamische Sprache), die als Ergebnis ein Konzept der Objekt-Erweiterung implementiert wurde, über die Verwendung von 'prototype' - Eigenschaft.
So, ich denke, es gibt einige pros für protytype-basierte OO wie in JavaScript implementiert:
Hier sind einige der Nachteile der prototypal OO:
InformationsquelleAutor der Antwort Amit