Thread Ein paar Programmiertricks (39 answers)
Opened by roooot at 2008-03-22 23:16

murphy
 2008-03-23 21:03
#107411 #107411
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
KurtZ+2008-03-23 16:02:23--
[...] Verstehe deinen Schluss nicht, nur weil die Vererbung prototypisch ist hat JS doch wohl trotzdem Klassen. [...]


Das ist schlicht falsch. ECMA-262 konformes JavaScript kennt das Konzept einer Klasse im Sinne der objektorientierten Programmierung nicht. In dem gesamten Text des Standarddokumentes taucht dieses Konzept kein einziges Mal auf. "class" ist zwar ein reserviertes Wort in JavaScript, aber nur deswegen, weil damit gerechnet wurde, dass spätere Versionen vielleicht auch einmal Klassen unterstützen. Da wo das Standarddokument überhaupt den Begriff Klasse erwähnt, meint es damit einen String, der für Menschen lesbar den ungefähren Typ eines Objektes angibt; und selbst diese "Klasse" ist eine interne, für den Programmierer nicht notwendigerweise zugängliche, Eigenschaft von JavaScript-Objekten und dient lediglich Präsentationszwecken.

Man kann nun allerdings mit prototypenbasierter Objektorientierung, welche in gewissem Sinne mächtiger als klassenbasierte ist, Klassen emulieren, was gerade bei JavaScript in aller Regel auch getan und zum Beispiel durch die einfache Definition konstruktorähnlicher Funktionen noch erleichtert wird.

Dennoch gibt es ganz wesentliche Unterschiede zwischen klassenbasierter und prototypenbasierter Objektorientierung: Während bei einer klassenbasierten Sprache in aller Regel sowohl die Codebestandteile einer Klasse als auch die Datenstruktur ihrer Instanzen zur Kompilationszeit festgelegt werden können, ist das bei prototypenbasierten Sprachen inhärent unmöglich. In einem gewissen Sinne ist bei JavaScript jedes einzelne Objekt die Instanz einer Singletonklasse. Die Struktur und Methoden eines Objektes sind immer Teil seiner Laufzeitdaten. Man kann stets für jedes JavaScript-Objekt einzeln zur Laufzeit die Menge seiner Eigenschaften und Methoden modifizieren. Und man kann jedes beliebige Objekt als Prototyp auffassen und neue Objekte von ihm ableiten. Diese beiden Eigenschaften sind auch in Skriptsprachen bei klassenbasierter Objektorientierung nicht gegeben.

Da nun aber die wenigsten Menschen wissen, dass JavaScript prototypenbasiert ist und was das bedeutet, lässt auch die Implementation des standardkonformen Verhaltens der Sprache in vielen Browsern zu wünschen übrig, zumal die oben erwähnten Eigenschaften schwierig zu realisieren sind. Wenn z.B. JavaScript-Objekte einer Dokumentenobjektmodellimplementation intern durch Instanzen von Klassen der Implementationssprache des Browsers repräsentiert werden, ist es oft nicht möglich, ihnen beliebige zusätzliche Eigenschaften und Methoden zu verpassen, oder wenn es möglich ist gehen diese Eigenschaften oftmals bei bestimmten Operationen wieder verloren, weil sich die Identität der Objekte verändert, ohne dass das auf der JavaScript-Seite sofort offensichtlich wäre. Wird das Marshalling der Objekte dann noch durch Techniken wie ein Komponentenobjektmodell zusätzlich kompliziert, so blickt endgültig niemand mehr durch und man muss an einigen Stellen auf all die coolen Features von JavaScript verzichten wenn man noch funktionierenden Code erhalten will ;-)
When C++ is your hammer, every problem looks like your thumb.

View full thread Ein paar Programmiertricks