KAPITEL 3 JavaScript objektorientiert (S. 53)
Die Konzeption der Sprache JavaScript sieht keine Klassen vor – es gibt nur Objekte. Genau genommen verfügen diese auch nicht über Methoden, sondern Funktionen. Diese Funktionen wiederum haben aber auch Objekteigenschaften. Außerdem ist Java- Script vielmehr eine funktionale als eine objektorientierte Programmiersprache. Da es keine Klassen gibt, basieren die objektorientierten Prinzipien der Sprache auch nicht auf herkömmlicher Vererbung von Eigenschaften einer Klasse an eine andere.
Vielmehr werden Objekte als Prototypen verwendet, deren Eigenschaften von anderen Objekten erweitert werden können. Deshalb besitzt jedes JavaScript-Objekt auch immer die Eigenschaft prototype. Wird auf eine Eigenschaft eines Objekts zugegriffen, die das Objekt selbst nicht hat, wird versucht, diese Eigenschaft über das Objekt zur ermitteln, das der Eigenschaft prototype zugeordnet ist. Ist sie auch dort nicht zu finden, wird dieses Verfahren bis zum Ende der Prototypkette fortgeführt.
Um die Verwirrung nicht noch zu vergrößern, werde ich – wie bisher in diesem Buch auch – von Klassen und Methoden bzw. Eigenschaften sprechen. Den Begriff Funktion oder statische Me- thode verwende ich, wenn diese keinem konkret zu erstellenden Objekt zugeordnet wurde. Mithilfe von Dojo ist es auch recht einfach, in diesen Kategorien zu denken, da Dojo einen Rahmen für objektorientiertes Arbeiten mit JavaScript bereitstellt.
3.1 Klassen definieren
Über die Eigenschaft prototype muss man sich keine Gedanken machen, wenn man Dojo verwendet. Um eine neue Klasse zu definieren, benutzt man die statische Methode dojo.declare. Eigentlich heißt die Funktion dojo.lang.declare. Man kann aber auch die abgekürzte Version benutzen. Der erste Parameter ist der Name der zu definierenden Klasse. Dojo sorgt dafür, dass die benötigten Objekte für die Modulstruktur erstellt werden. In diesem Fall wird ein Objekt dojokompakt erstellt, das über ein Objekt Figur verfügt.
Der zweite Parameter gibt die Vererbungshierarchie an. Da die Klasse dojokompakt.Figur eine (abstrakte) Oberklasse werden soll, gibt es keine übergeordneten Klassen und der Parameter ist null. Man hätte ihn auch ganz weglassen können. Bei Bedarf kann man eine Konstruktorfunktion angeben. Der Inhalt dieser Funktion wird bei jeder Objekterstellung per new ausgeführt. Es ist ebenfalls möglich, innerhalb des Konstruktors Eigenschaften der Objekte zu initialisieren. Diese müssen aber unbedingt mit der Eigenschaft this zugewiesen werden. Andernfalls wären sie nur innerhalb der Konstruktorfunktion sichtbar. Man könnte auf diese Weise private Eigenschaften und Methoden der Klassen definieren.
Das sollte man aber nur in Ausnahmefällen tun, da die Methoden (also die Funktionsobjekte) später in jedem Objekt der Klasse Speicher verbrauchen. Dojo verfügt deshalb auch nicht explizit über die Möglichkeit, private Eigenschaften und Methoden zu definieren, sondern benutzt die Konvention, dass alle privaten Eigenschaften mit einem Unterstrich beginnen. Dadurch sind diese Eigenschaften natürlich nicht privat im Sinne der Kapselung. Trotzdem sollte man sich daran halten, da sich die Implementierung ohne Vorwarnung ändern kann.
Die eigentlichen Eigenschaften und Methoden der Klasse werden in einem assoziativen Array definiert. Im Beispiel ist das die Eigenschaft Farbe und die Methode zeichne. Da es in JavaScript keine Möglichkeit gibt, Methoden als abstrakt zu deklarieren, muss man sich leider der Konvention bedienen, dass Methoden, die durch abgeleitete Klassen implementiert werden müssen, die Funktion dojo.unimplemented aufrufen.
|