Prototypenbasierte Programmierung
Prototypenbasierte Programmierung, auch als klassenlose Objektorientierung bekannt, ist eine Form der objektorientierten Programmierung, die auf das Sprachelement der Klasse verzichtet. Objekte werden nicht durch Instanziierung einer Klasse, sondern durch Klonen bereits existierender Objekte erzeugt. Bei diesem Klonen werden alle Eigenschaften (Attribute und Methoden) des Prototyp-Objektes kopiert, sie können aber überschrieben werden, und das neue Objekt kann mit neuen Eigenschaften versehen werden.
Alle bestehenden Objekte können Prototypen neuer Objekte sein.
Einige Sprachen kopieren die Objekte beim Klonen vollständig und es bleibt keine Verbindung zwischen dem Klon und seinem Prototyp; die meisten prototypenbasierten Sprachen verwenden aber ein spezielles Attribut, über das eine Verbindung vom Klon zum Prototyp aufrechterhalten wird. Über diese Verbindung erben alle vom Prototyp geklonten Objekte auch nachträgliche Änderungen am Prototyp.
Die Objekte können als assoziatives Array verstanden werden; die Schlüssel dieser Tabelle werden für gewöhnlich Slot genannt, wobei meistens nicht zwischen Attributen (Daten) und Methoden (Operationen) des Objekts unterschieden wird: Methoden-Slots verweisen häufig nur auf außerhalb des Objektes liegenden Programmcode.
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 Compilezeit 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 prototypenbasierten Sprachen bei diesen nicht realisieren.
Beispiel
Das folgende Beispiel in ECMAScript 5 erzeugt zuerst ein Objekt object1
, das wir danach als Prototyp verwenden werden. Es hat die Attribute a
und b
, denen auch gleich die Werte 1 bzw. 2 zugeordnet werden.
var object1 = { a : 1, b : 2 };
Zum Klonen gibt es in ECMAScript 5 eine vordefinierte Funktion Object.create()
. Der gewünschte Prototyp wird als Argument angegeben. Dieser Klon erhält im Beispiel den Namen object2
.
var object2 = Object.create( object1 );
Diesem neuen Objekt können nun weitere Attribute zugeordnet werden
object2.c = 3;
object2.d = 4;
Das geklonte Objekt hat nun vier Attribute:
- a = 1 (vom Prototyp geerbt)
- b = 2 (vom Prototyp geerbt)
- c = 3 (nach dem Klonen hinzufügt)
- d = 4 (nach dem Klonen hinzufügt)
Liste prototypenbasierter Programmiersprachen
- Self
- ECMAScript
- JavaScript
- ActionScript (seit AS3 zunehmend klassenorientiert)
- Io
- Lua
- REBOL
- NewtonScript
- Snap! (BYOB) – als bisher einzige erziehungsorientierte visuelle Programmiersprache dieser Auflistung
- SimTalk
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.