Hier gibt es ungefähr hundert Terminologieprobleme, die sich hauptsächlich um jemanden (nicht Sie) drehen, der versucht, seine Idee wie The Best klingen zu lassen.
Alle objektorientierten Sprachen müssen mit verschiedenen Konzepten umgehen können:
- Kapselung von Daten zusammen mit zugehörigen Operationen an den Daten, die unter anderem als Datenelemente und Elementfunktionen oder als Daten und Methoden bezeichnet werden.
- Vererbung, die Fähigkeit zu sagen, dass diese Objekte genau wie die anderen Objekte sind, AUSSER für diese Änderungen
- Polymorphismus ("viele Formen"), bei dem ein Objekt selbst entscheidet, welche Methoden ausgeführt werden sollen, sodass Sie sich auf die Sprache verlassen können, um Ihre Anforderungen korrekt weiterzuleiten.
Nun zum Vergleich:
Das erste ist die ganze Frage "Klasse" gegen "Prototyp". Die Idee begann ursprünglich in Simula, wo mit einer klassenbasierten Methode jede Klasse eine Reihe von Objekten darstellte, die denselben Zustandsraum (lesen Sie "mögliche Werte") und dieselben Operationen gemeinsam hatten, wodurch eine Äquivalenzklasse gebildet wurde. Wenn Sie auf Smalltalk zurückblicken, da Sie eine Klasse öffnen und Methoden hinzufügen können, entspricht dies praktisch dem, was Sie in Javascript tun können.
Später wollten OO-Sprachen die statische Typprüfung verwenden können, daher kamen wir auf die Idee einer festen Klasse, die zur Kompilierungszeit festgelegt wurde. In der Open-Class-Version hatten Sie mehr Flexibilität. In der neueren Version hatten Sie die Möglichkeit, einige Arten von Korrektheit am Compiler zu überprüfen, die andernfalls getestet worden wären.
In einer "klassenbasierten" Sprache erfolgt das Kopieren zur Kompilierungszeit. In einer Prototypsprache werden die Operationen in der Prototypdatenstruktur gespeichert, die zur Laufzeit kopiert und geändert wird. Abstrakt ist eine Klasse jedoch immer noch die Äquivalenzklasse aller Objekte, die denselben Zustandsraum und dieselben Methoden verwenden. Wenn Sie dem Prototyp eine Methode hinzufügen, erstellen Sie effektiv ein Element einer neuen Äquivalenzklasse.
Warum das? in erster Linie, weil es zur Laufzeit einen einfachen, logischen und eleganten Mechanismus ergibt. Um ein neues Objekt oder eine neue Klasse zu erstellen, müssen Sie lediglich eine Tiefenkopie durchführen und alle Daten und die Prototypdatenstruktur kopieren. Vererbung und Polymorphismus erhalten Sie dann mehr oder weniger kostenlos: Die Methodensuche besteht immer darin, ein Wörterbuch nach einer Methodenimplementierung nach Namen zu fragen.
Der Grund, warum wir in Javascript / ECMA-Skripten gelandet sind, ist im Grunde, dass wir uns vor 10 Jahren mit viel weniger leistungsfähigen Computern und viel weniger ausgefeilten Browsern befasst haben. Durch die Wahl der prototypbasierten Methode konnte der Interpreter sehr einfach sein und gleichzeitig die gewünschten Eigenschaften der Objektorientierung beibehalten.