Instanzen - eine kurze Beschreibung von "new"
Definitionen: Klasse:
eine Vorlage (die benutzt wird um Eigenschaften eines Objektes zu setzen) |
Um Klassen und Instanzen mit dem bisher gelernten miteinander verknüpfen zu können:
Instanzen
(Objekte) sind echte Dinge welche Eigenschaften besitzen können (z.B. instanz1.x
hat die Eigenschaft x).
Instanzen können als Container angesehen werden, Klassen sind Beschreibungen/Pläne
von Dingen die in einen Container kommen.
Instanzen haben eine Reichweite (scope) und können (natürlicherweise)
nicht hinaussehen. - Ähnlich verhalten sich Klassen.
Instanzen werden durch Klassen erzeugt und stehen miteinander in Verbindung
- wir haben dieses Thema soeben begonnen.
In den vorhergehenden Beispielen haben wir bereits ein paar Objekte erstellt und die meisten Dinge funktionierten wie wir erwartet hatten, aber:
verstehen wir wirklich was vor sich geht? Lassen Sie uns einen genauen Blick darauf werfen. Hier ist eine Zusammenfassung des Codes:
| 1)
Vorlage
= function() 2) { 3) this.x = 5; 4) this.y = 7; 5) } 6) inst1 = new Vorlage( ); |
![]() |
Wie kommt inst1 an die Eigenschaften x und y? Woher weiss Actionscript, dass wir genau diese setzen wollen? Lassen Sie es uns Schritt für Schritt durchgehen. Zuerst wird eine Klasse definiert. Es ist nur eine Definition und macht nichts solange sie nicht aufgerufen wird. Die erste Zeile in der wirklich etwas ausgeführt wird (abgesehen von Definitionen) ist Zeile 6. Die rechte Seite eines Ist-Gleich Zeichens wird immer zuerst ausgeführt, also beginnen wir hier. Das Wort "new" tut viele Dinge, aber das Wichtigste ist das Erstellen eines Objektes ohne Eigenschaften und Name. Anschliessend wird dieses "leere Objekt ohne Namen" an die Vorlage übergeben.
![]() |
Jede Klasse erwartet und erhält ein leeres Objekt wenn sie aufgerufen wird. Dieses "leere Objekt" erhält den temporären Namen "this" wenn der Code-Block beginnt, er wird zudem nach dem Ausführen des Codes wieder "weggenommen". Während der Code ausgeführt wird, werden dem "this" einige Eigenschaften zugewiesen wie es in der Klasse namens Vorlage definiert wurde. Auf diese Weise wird das Objekt nach und nach befüllt, in diesem Beispiel erhält das Objekt also die beiden Eigenschaften x und y mit den Werten 5 und 7. Wurde das Ende der Vorlage erreicht, wird das Objekt (nun mit zwei neuen Eigenschaften) zurückgeliefert. Zeile 6 bedeutet also: inst1 = << a box(object) with two properties, x:5 and y:7 >> |
Als letztes
wird diesem Objekt ein Name zugewiesen, in diesem Fall "inst1". Sie
können nun das resultierende Objekt auf die Eigenschaften x und y überprüfen.
- Sie sollten die Werte 5 und 7 besitzen.
Der einzige Weg eine Klasse in ActionScript zu definieren ist mit Hilfe des function Befehls. Nur Klassen können Instanzen erzeugen. Generell kann man "functions" also in zwei Typen unterscheiden: Klassen und Methoden. Diese beiden Begriffe verwendet man anstatt "function", um Verwirrung zu vermeiden.
![]() |
Das Wort "Instanz" kennen Sie vermutlich bereits aus Flash. Man kann Instanzen von Symbolen in der Bibliothek erstellen, indem man sie von der Bibliothek heraus auf die Szene draggt. Diese Vorgangsweise ist nicht nur ähnlich zum Erstellen von Instanzen aus Klassen, sondern genau dasselbe! Ein Symbol auf die Szene zu draggen entspricht dem Prinzip von "new": es wird ein leerer Movieclip erstellt (wenn es sich beim Symbol um einen Movieclip handelt) und anschließend alle Unterobjekte und Zeichnungen aus der Vorlage (in diesem Falle: dem Symbol) etc. übernommen. Ein Symbol entspricht sozusagen einer Klasse, mit dem Unterschied, dass Eigenschaften eines Movieclips grafische Elemente sind. - Sie wissen bereits, wie sinnvoll der Einsatz von Vorlagen zum Erstellen von Objekten in Flash ist. Dasselbe angewandt auf ActionScript geschieht ziemlich aus denselben Gründen. |
Vielleicht glauben Sie nicht ganz, dass jede Klasse ein namensloses Objekt erhält. Fairerweise, ein Beispiel:
A = function()
{
return 7;
}
y = A(); // 7
Um es vorweg zu nehmen: hierbei handelt es sich nicht um eine Klasse. Klassen liefern nie Werte zurück und werden immer über "new" aufgerufen! In Wirklichkeit handelt es sich hierbei um eine Methode, auf welche wir kurz eingehen wollen: Kurzgesagt, eine Methode ist eine Funktion die zu einer Klasse gehört. Die beiden Begriffe "Methode" und "Funktion" werden oft gleichgestellt benutzt. Wie auch immer, Klassen sind etwas Unterschiedliches hierzu. Wie auch immer wir sie nennen, alle Funktionen erhalten ein Objekt in Form von "this". Klassen erhalten leere Objekte, und Methoden erhalten bereits existierende. Doch zurück zum eigentlichen Thema ...
In dem man nur schreibt A() sieht es so aus als gäbe es keinen Zeitpunkt an dem ein Objekt an die function übergeben wird, an welchem die Eigenschaften "kleben" - woher sollte es dann kommen? Wenn es nicht notwendig oder möglich ist, ein Objekt an eine Funktion zu übergeben, beziehen sich alle Befehle automatisch auf den Container, indem sich der ActionScript Code befindet. In diesem Fall wäre es also automatisch _root.A(), nachdem sich der Code innerhalb der Szene befand. Der folgende Code zeigt dies:
A = function(){
this.x = 5; // _root.x = 5
return 7;
}
var y = A();
trace (_root.x); // 5
trace (y); // 7
Wie Sie sehen können wurde _root an die Funktion übergeben und mit
dem "this" Schlüsselwort verknüpft. Sobald die Funktion
zuende war, zeigt das trace-Kommando, dass dies in Wirklichkeit dem _root Objekt
entspricht..