Konstruktor

Das Wort "Konstruktor" bedeutet, "das Ding welches ein Objekt erzeugt". Wir alle wissen, dass Objekte von Klassen erzeugt werden. Also muss ein Konstruktor ein anderes Wort für eine Klasse sein. Das trifft annähernd zu. In Actionscript (nur hier) sind Klassen eine Art von Funktion, und ein Konstruktor ist ein besonderer Teil einer Klasse. Es ist der Teil der Klasse der Objekte erzeugt, wie man erahnen mag. Wir wissen, dass Objekte mit Hilfe des "Aktivierungsobjektes" und Argumenten konstruiert werden. Also scheint ein Konstruktor nichts anderes als das Aktivierungsobjekt zu sein, und ja, dies ist so ziemlich was der Konstruktor ist. Die Verwirrung entsteht dadurch, dass wir wissen, dass ein Aktivierungsobjekt nicht existiert solange es nicht aufgerufen wurde, und gelöscht wird sobald es beendet wird. In Wirklichkeit "aktiviert" man dieses Objekt, indem man die ihm zugewiesene Eigenschaft benutzt, das ist das Objekt welches die Klasse benennt. Das funktioniert gut, weil die Argumente zwischen beiden Objekten übergeben werden, und beide so eng miteinander zusammenarbeiten, dass es oft als ein einziges Objekt angesehen wird.
Warum ist es so wichtig, diese genaue Kenntnis über den Konstruktor zu besitzen? Weil es eines derjenigen undokumentierten Actionscript Schlüsselwörter darstellt, die sehr handlich sein können. Jede Instanz hat eine Konstruktoreigenschaft, und sie Zeigt auf die Klasse die sie erstellt hat. Um genau zu sein, es zeigt auf das Objekt welches die Klasse benennt. Wenn Sie das Wort Konstruktor aus Sicht einer Instanz benutzen, ergibt dies also die Klasse welche die Instanz erstellte. Wo wir schon über Teile der Klasse sprechen, es zeigt auf das Aktivierungsobjekt, gemeinsam mit Argumenten und Namensobjekt. Es sollte nicht Aufschluss über Prototypen, Eigenschaften die zum Klassennamenobjekt (z.B. Hund.count) gehören geben, da diese nicht unmittelbar mit dem Erzeugen des Objekts involviert sind. Wahrscheinlich glauben Sie, dass es Haarspalterei ist. Ja, wahrscheinlich ist es das. In den meisten OO Sprachen sind der Konstruktor und der Name einer Klasse zwei verschiedene Dinge. In Actionscript sind es auch zwei verschiedene Dinge, allerdings zusammengerollt in einem Ball, es bleiben nur die Bedeutungen der beiden um sie auseinanderzuhalten. Deshalb ist es so wichtig den genauen technischen Hintergrund zu kennen:

Klasse - das Ganze mit allem drum und dran

Konstruktor - jener Teil, der neue Dinge erstellt

Wir haben zuerst darüber gesprochen, wie Instanzen eine Referenz auf die Klasse erhalten können, dies geschieht mit dem "constructor" Schlüsselwort. Es wird immer von innerhalb eines Objektes benutzt, hier ein Beispiel:

Dog = function( )

{

this.instNum = ++this.constructor.count;

}

// die nächsten beiden Eigenschaften sind nicht wirklich Teil von "constructor"

Dog.count = 0; // dient zum Zählen, wieviele Dogs erstellt wurden

Dog.className = "Dog"; // dient zum Merken des Klassennamens

rover = new Dog( );

fido = new Dog( );

trace( rover.instNum ); // 1 (erster Dog erzeugt)

trace( fido.instNum ); // 2 (zweiter Dog erzeugt)

trace( rover.constructor.className ); // Dog

Obwohl es häufig nicht üblich ist die Konstruktoreigenschaft zu verwenden, manchmal kann genau dies der Schlüssel zum Erfolg sein. Der Vorteil vom Zugriff der Form instance.constructor.xxx anstelle von Dog.xxx ist der, dass Sie nachträglich die Klasse Dog in Canine umbenennen können, ohne den restlichen Code nach "Dog" durchsuchen zu müssen. Dies macht Ihren Code portabler, wenn Sie ihn in verschiedenen Klassen benutzen wollen, oder in verschiedenen Programmen.

Interessanterweise hat auch der Prototyp einer Klasse einen Konstruktor. Der Grund hierfür ist, dass er selbst ein Objekt ist welches erstellt wurde. Wenn Sie eine Klasse definieren wird sofort ein Namensobjekt erstellt, aber nicht sofort ein Aktivierungsobjekt (das geschieht nur bei einem Aufruf). Es wird jedoch ein Prototyp-Objekt erstellt, es geschieht sofort nachdem eine Klasse definiert wird. Wohin zeigt der Prototyp? Zum Klassen Namensobjekt, genauso wie die Instanz es tut. Wie kann man das überprüfen? Im obigen Beispiel könnte man hinzufügen:

trace( Dog.prototype.constructor.className ); // Dog

Das ist ein ganz schöner Happen, aber wenn Sie es verfolgen besagt es lediglich "Trace den className vom Objekt welches den Dog Prototyp erstellte". Wenn Sie diese Zeile im Code nach oben oder nach unten verschieben, können Sie herausfinden, dass das Prototyp-Objekt erstellt wird, sobald die Klasse Dog deklariert wurde - noch bevor irgendwelche Eigenschaften im Prototyp definiert werden.

Das letzte Schräge, dass es zu wissen gibt, ist: Das Namensobjekt (Dog) hat keine Konstruktoreigenschaft, obwohl es selbst auch ein Objekt ist welches erstellt wurde! Funktionsnamen haben keinen Konstruktor in Actionscript, obwohl sie es in ähnlichen Sprachen wie z.B. in JavaScript haben. Die Gründe hierfür sind Komplex, aber alle laufen zum Schluss darauf hinaus, dass der Flashplayer so klein wie möglich bleiben soll. Zumindest glaube ich das ;-) Lassen Sie uns besser schnell zum nächsten Punkt "Methoden" übergehen.







Navigation
Einleitung · Objekte · Klassen · Instanzen · Lokal · Vererbung · Prototypen · Overriding · Overwrite · Protection · Argumente · Konstruktor · Methoden · __proto__ · arguments[] · callee · caller