Prototyp

Im Zusammenhang mit der objektorientierten Programmierung ist ein Prototyp ein Objekt, welches als Vorlage für die Generierung von weiteren Objekten dient. Die Vorlage kann wiederum eine Kopie eines Objektes oder auch eine entsprechende Referenz auf dieses sein. Grundsätzlich können alle bereits existierenden Objekte als Prototypen für neue Objekte gelten. Die geerbten Eigenschaften - das sind Attribute und Methoden - verhalten sich wie die ursprünglichen Eigenschaften des Prototyps.


JavaScript ist ein Beispiel für eine Programmiersprache, die dieses auf der Basis von Objekten aufbauende Verfahren der Vererbung unterstützt. Ein Vorteil dieses Mechanismus ist es, dass Prototypen und davon abgeleitete Objekte zur Laufzeit des Programms modifiziert werden können. Man spricht hier auch von Prototyp-basierter Programmierung oder gleichfalls von der klassenlosen Objektorientierung.

Das Baumuster für Objekte

Bei der Erzeugung von Objekten auf der Basis von Klassen wird deren Struktur durch die Struktur der Klasse bestimmt. Damit sind die Eigenschaften eines Objektes - d.h. seine Attribute und Methoden - bereits bei deren Erzeugung festgelegt, wobei diese dann nicht mehr modifizierbar sind. Die Klasse ist das zugrundliegende "Baumuster" des Objektes. Einen alternativen Weg geht die Prototyp-basierte Programmierung. Dabei wird ein neues Objekt auf der Grundlage eines Prototypens erstellt, und die konkrete Struktur des Objektes wird erst im Anschluss daran festgelegt. So können beispielsweise Attribute und/oder Methoden ergänzt werden, um so das Verhalten des neuen Objektes spezifisch beeinflussen zu können. Auch kann der Prototyp modifiziert werden, um so ein bestimmtes Verhalten eines Objektes zu generieren. Dabei sind in Folge natürlich alle auf Basis dieser geänderten Prototypen erzeugten Objekte von diesen Modifizierungen betroffen. Dieser Mechanismus der Anpassung von Prototypen zur Laufzeit eines Programms hat aber den offensichtlichen Nachteil von möglichen Seiteneffekten oder den der schlechteren Wartbarkeit von Programmen. Die Flexibilität von Prototyp-basierten Programmiersprachen bei dieser Form der Modellierung bedingt auch, dass Optimierungen, wie das sie von Compilern klassenbasierter Strukturen während der Übersetzung durchgeführt werden, so nicht möglich sind. Dies kann auch negativ auf die Performance Prototyp-basierter Anwendungen einwirken.

JavaScript als Prototyp-basierte Programmiersprache

Ein populäres Beispiel für eine Prototyp-basierte Programmiersprache ist JavaScript, die das Konzept der Klassen - und damit auch das der Klassen-basierten Vererbung - nicht unterstützt. Allerdings kann JavaScript aufgrund der Flexibilität der Sprache so verwendet werden, dass es wie bei einer Programmiersprache mit klassischen Vererbungsmechanismen aussieht. Dazu werden Klassen durch Funktionen deklariert und Instanzen mit dem auch in JavaScript bekannten new Operator erzeugt. Die so entstehenden Objekte verhalten sich dann ähnlich wie Objekte in beispielsweise in Java, C++ u.a.

In JavaScript deklariert man ein Objekt zunächst gänzlich ohne bestimmte Eigenschaften. Erst wenn das neue Objekt bereits vorliegt, wird mit dem prototype Konstrukt ein Objekt zugeordnet, welches die Vorlage (das Prototyp-Objekt) darstellt. Dadurch werden alle Eigenschaften - Attribute sowie Methoden - komplett auf das neue Objekt abgebildet. So erhält das neue Objekt praktisch eine Referenz auf das Prototyp-Objekt. Auch hier gilt, dass alle Modifizierungen an der Vorlage sichtbar werden in den Objekten, die auf deren Basis erstellt wurden. Weil es immer nur ein prototype Konstrukt für eine Funktion gibt, ist jedoch eine Mehrfachvererbung nicht möglich.

Beispiel für ein Prototypen-Konstrukt

Beispiel für ein Prototypen-Konstrukt

Zunächst wird der Konstruktor für die Klasse erstellt - das ist - wie auch in Java u.a. Programmiersprachen üblich - der Name der Klasse. Die Instanzattribute werden mit this im Konstruktor erstellt. Für die Erstellung von Methoden werden diese in das prototype-Objekt der Klasse eingefügt.

Mit new gekennzeichneter Konstruktor

Mit new gekennzeichneter Konstruktor

Um ein Objekt zu erzeugen, muss die o.g. Klasse instanziiert werden. Dazu muss deren Konstruktor mit new aufgerufen werden.

Informationen zum Artikel
Deutsch: Prototyp
Englisch:
Veröffentlicht: 28.10.2013
Wörter: 610
Tags: #Grundlagen der Informationstechnik
Links: Anpassung, Anschluss, Attribut, C++, Compiler