Lokale Eigenschaften innerhalb von Funktionen
Was passiert, wenn wir eine Eigenschaft mit Hilfe des "var" Schlüsselwortes definieren? - Eine lokale Eigenschaft wird erstellt. Lokal heißt ganz einfach "lokal zum Gültigkeitsbereich des aktuellen Objekts", oder vielleicht "innerhalb dieses Containers", wenn Ihnen das lieber ist. Es ist vergleichbar mit Leuten in einem kleinen Dorf, die dort geboren sind, dort aufwachsen und dort beerdigt werden, die es niemals schaffen, aus dem Ort herauszukommen. Hier ist ein Beispiel für eine lokale Eigenschaft innerhalb einer Klasse:
A = function()
{
var temp = 5;
this.x = temp;
}
trace(A.temp); // not here
Wo genau existiert die temp Eigenschaft in diesem Beispiel? - Es ist das "Aktivierungsobjekt" (oft auch als Konstruktor bezeichnet) in der function A. Heisst das, dass man es über A.temp ansprechen kann? Nein, weil der Konstruktor in diesem Beispiel nicht ausgeführt wird. Heißt das, dass es ansprechbar wäre nachdem der Konstruktor ausgeführt wurde? Schonwieder nein, weil temp ignoriert wird sobald der Konstruktor zuende ausgeführt wurde. In Wirklichkeit wird temp bei jedem Aufruf des Konstruktors neu erstellt, und nach jedem Ausführen wieder ignoriert (wenn auch nicht unbedingt sofort aus dem Speicher gelöscht). Also "lebt" temp nur innerhalb dieses temporären Objektes. Wie auch immer, das Konstruktorobjekt hat keinen Namen und ist nur verfügbar während die Konstruktorfunktion ausgeführt wird, es kann also nur innerhalb darauf zugegriffen werden. Nach dem Durchlauf werden lokale Eigenschaften nicht gesichert.
![]() |
Leute sagen oftmals, dass "in ActionScript alles ein Objekt ist", was nicht unbedingt richtig ist, da manche Dinge ganz einfach keine Objekte sind. Interessanterweise sind andere Dinge wiederrum mehr als nur ein Objekt. Die Funktion oben besteht aus zwei Objekten (in Wirklichkeit sogar drei, wir kommen noch im Detail dazu). Es gibt eine Referenz auf das Objekt namens A die sich wie jedes andere Objekt verhält. Sie können Eigenschaften hinzufügen, z.B. A.temp, und diese Eigenschaften werden in das Objekt gelegt. Weiters haben Sie einen Block mit Instruktionen die die Funktion darstellen. Das ist das zweite Objekt, der Konstruktor welcher bei jedem Aufruf der Klasse ausgeführt wird. |
Die Nützlichkeit des ersten Objekts A ist begrenzt. Seine größte Aufgabe ist es dem Funktionsblock einen Namen zu geben, sodass es später unter diesem aufgerufen werden kann. In Folge können Sie dessen Namen als Namespace für Informationen über die Funktion selbst benutzen. Ein Beispiel für solch eine Information stellt der Klassenname dar (für Debugging Zwecke), oder ein Counter der die Anzahl der von dieser Klasse erstellten Instanzen zählt. Eigenschaften an diesem Ort haben keinen Effekt auf die Funktion und scheinen nicht in den Instanzen auf.
Das zweite Objekt, der Konstruktor, regelt das "Erstellen" einer Instanz, was natürlich sehr nützlich ist. Er hat seine eigene Reichweite und so zeigt "this" auf das Objekt welches erstellt und modifiziert werden kann. Das ist allerdings nur Teil des Erstellens einer Instanz - ein vielleicht sehr bekannter Teil, jedoch nicht die Hauptarbeit, wie wir beim genaueren Betrachten von prototype's sehen werden.
![]() |
Die Idee von Funktionen ist es, jedes Mal einen Block mit Instruktionen auszuführen, wenn die Funktion aufgerufen wird. - Das passt gut zu Flash. Ein Symbol in der Bibliothek hat Informationen für all seine Instanzen (wie sehen sie aus, wie verhalten sie sich). Was nun aber mit dem zweiten Teil der Funktion "A Objekt" vom vorigen Beispiel? Dieser Teil war wichtig zum Speichern von Informationen über das Objekt selbst, ist jedoch unrelevant für dessen Instanzen. Wenn Sie z.B. "Update Use Count" in der Bibliothek anklicken, erhalten Sie die gewünschte Information zu allen Symbolen. Und wieder ist diese Eigenschaft nur relevant für die Klasse (Symbol) und nicht für die Instanzen. In Actionscript können Sie Zugriff auf diese Informationen erhalten (mit Hilfe von instance.constructor.temp, mehr dazu später) während in Flash diese Art von Information für die Instanzen nicht zugänglich ist (nur für Sie, dem User). Oft benötigt man keine Namespaces beim Programmieren mit Actionscript, aber manchmal ist es perfekt einsetzbar! Ein Beispiel hierfür wäre der einfache Counter der alle aktiven Instanzen einer bestimmten Klasse zählt - ziemlich genau dem "Use Count" in der Flash Bibliothek entsprechend. |