- Prototypenbasierte Programmierung
-
Prototypenbasierte Programmierung, auch als klassenlose Objektorientierung bekannt, ist eine Form der Objektorientierten Programmierung, die auf das Sprachelement der Klasse verzichtet. Objekte werden durch Klonen bereits existierender Objekte erzeugt. Alle bestehenden Objekte können Prototypen neuer Objekte sein. Beim Klonen werden alle Eigenschaften (Attribute und Methoden) des Prototyp-Objektes kopiert; das neue Objekt kann mit neuen Eigenschaften versehen und die kopierten verändert werden. Einige Sprachen kopieren die Objekte beim Klonen vollständig und es bleibt keine Verbindung zwischen dem Klon und seinem Prototypen; die meisten prototypenbasierten Sprachen verwenden aber ein spezielles Attribut (in JavaScript z. B. "prototype" genannt), über das eine Verbindung vom Klon zum Prototypen aufrechterhalten wird. Über diese Verbindung erben alle vom Prototypen geklonten Objekte auch nachträgliche Änderungen am Prototypen.
Objekte können als Assoziatives Array verstanden werden; die Schlüssel dieser Tabelle werden für gewöhnlich Slot genannt, wobei meist nicht zwischen Attributen (Daten) und Methoden (Operationen) des Objekts unterschieden wird: Methoden-Slots verweisen häufig nur auf außerhalb des Objektes liegenden Programmcode.
Inhaltsverzeichnis
Vor- und Nachteile
Prototypenbasierte Sprachen erlauben eine größere Flexibilität bei der Modellierung, da sie den Programmierer nicht zwingen, seine Objekte in eine statische, zur Compile-Zeit festgelegte Klassenstruktur zu bringen. Objekte bleiben zur Laufzeit strukturell veränderbar. Diese Flexibilität beinhaltet aber auch das Risiko einer schlechteren Wartbarkeit des Programms.
Viele Optimierungen, die der Compiler in klassenbasierten Sprachen bereits zum Zeitpunkt der Übersetzung vornehmen kann, lassen sich aufgrund der dynamischen Natur von prototypen-basierten Sprachen bei diesen nicht realisieren.
Beispiele
Das folgende Beispiel in der Programmiersprache JavaScript erzeugt zwei Objekte,
object1
undobject2
, und stellt durch die Zeilechild.prototype = object1;
die Eltern-Kind-Beziehung zwischen den beiden Objekten her.var object1 = { a : 1, b : 2 }; function child() { this.c = 3; this.d = 4; } child.prototype = object1; var object2 = new child(); alert( object2.a ); // zeigt den Wert 1 an alert( object2.c ); // zeigt den Wert 3 an
Das zweite Beispiel, auch in der Programmiersprache JavaScript, erzeugt dieselben beiden Objekte, verwendet dabei aber das für die prototypenbasierte Programmierung typische Klonen. In ECMAScript 3, dem JavaScript zugrunde liegenden Standard, steht diese Funktion nicht automatisch zur Verfügung. Sie kann aber mit wenigen Zeilen Code selbst definiert werden.
function clone( object ) { function F(){}; F.prototype = object; return new F; } var object1 = { a : 1, b : 2 }; var object2 = clone( object1 ); object2.c = 3; object2.d = 4; alert( object2.a ); alert( object2.c );
Seit ECMAScript 5 existiert für diese Aufgabe die vordefinierte Methode
Object.create()
, womit eine eigene Helferfunktion unnötig wird.var object1 = { a : 1, b : 2 }; var object2 = Object.create( object1 ); object2.c = 3; object2.d = 4; alert( object2.a ); alert( object2.c );
Liste prototypenbasierter Programmiersprachen
- Self
- ECMAScript
- JavaScript
- ActionScript (seit AS3 zunehmend klassenorientiert)
- Io
- Lua
- REBOL
Im Prinzip lässt sich in jeder Programmiersprache, die Zeiger unterstützt, prototypenbasiert programmieren. Für Ruby und Perl existieren vorgefertigte Module, die dies unterstützen.Siehe auch
Quellen
- Ross Harmes, Dustin Diaz: Pro JavaScript Design Patterns. Apress, Berkley, 2008 ISBN 978-1-59059-908-2.
Wikimedia Foundation.