13.6 Selbst definierte Objekte
Um selbst definierte Objekte zu erzeugen, bietet Flash ebenfalls eine ganze Reihe an Möglichkeiten. Sollten Sie nur eine Instanz benötigen, dann erzeugen Sie in der Regel eine Instanz von der Klasse Object:
meineFreundin = new Object();
freundin.fla
Von nun an steht eine Instanz namens »meineFreundin« von der Klasse Object zur Verfügung. Wenn Sie Ihr Projekt über Steuerung • Film testen in der Entwicklungsumgebung ausprobieren und innerhalb des Testmodus das Menü Fehlersuche • Variablen auflisten wählen, dann zeigt Flash sämtliche Variablen und Instanzen inklusive der Freundin »meineFreundin« im Ausgabefenster an. Fehlersuche • Objekte auflisten hingegen beschränkt sich auf Movieclips, Texte, Formen und Schaltflächen.
Die Freundin-Instanz verwenden Sie ganz ähnlich wie Movieclip-Instanzen, wobei dieses Objekt von Haus aus andere Eigenschaften und andere Fähigkeiten besitzt. Eine horizontale Position oder die Methode play sind ihr zum Beispiel erst einmal fremd.
Möchten Sie nun eigene Eigenschaften erfinden, dann gestaltet sich das recht einfach. Die Angabe des Instanznamens, dann ein Punkt und dann ein Bezeichner reichen bereits aus, um eine Instanzvariable, also eine Eigenschaft zu definieren:
meineFreundin.name = "Sandra";
Da auch Funktionen bzw. Methoden über einen Bezeichner verfügen, funktioniert das an dieser Stelle genauso:
meineFreundin.noergle = function () {
trace("Menno!");
};
alternative Schreibweise
Nun besitzt meine Freundin immerhin einen Namen und die Fähigkeit zu nörgeln. Für diese Art der Objektinitialisierung bietet Flash eine zusätzliche Schreibweise mit geschweiften Klammern, die sich durch einen kürzeren, aber dafür schwerer lesbaren Programmcode auszeichnet:
// erzeuge Instanz
meineFreundin = {};
// erzeuge Instanz mit Eigenschaft
meineFreundin = {name:"Sandra"};
// erzeuge Instanz mit Eigenschaft und Methode
meineFreundin = {name:"Sandra",
noergle:function () {
trace("Menno!");
}
};
Zugriff
Auf eine Eigenschaft oder die Methode greifen Sie zu, indem Sie diese wie bei der Definition nur durch einen Punkt getrennt direkt im Anschluss an den Pfad zur Instanz angeben:
trace(meineFreundin.name);
meineFreundin.noergle();
Um innerhalb einer Methode einer Instanz auf eine Eigenschaft oder Methode derselben Instanz zuzugreifen, verwenden Sie das Schlüsselwort this, das einen Bezug zum Objekt beinhaltet. Andernfalls würde ActionScript die Eigenschaft oder Methode in dem Movieclip suchen, in der sie definiert ist (seit Flash MX) oder in der sie aufgerufen wird (Flash 5):
meineFreundin.geburtstag=new Date(1976, 10, 18);
meineFreundin.ermittleAlter=function (){
var aktuellesDatum=new Date();
var alter=new Date();
// Berechne Differenz zwischen heute und Geburtstag auf die Millisekunde genau
alter.setTime(aktuellesDatum-this.geburtstag);
// Berücksichtige Ursprung der Computerzeitrechnung
return alter.getFullYear()-1970;
}
trace(meineFreundin.ermittleAlter());
Prototypen
Um nun nicht für jede Freundin diese Zeilen jedes Mal wiederholen zu müssen, bietet es sich an, eine Klasse für Freundinnen zu entwerfen. In Flash spricht man an dieser Stelle von einem Prototypen. Dieser Prototyp wird als Funktion deklariert – was kein Problem ist, da es sich bei Funktionen ebenfalls um Objekte handelt. Es hat sich übrigens eingebürgert, den Funktionsnamen bei Klassen oder Prototypen mit einem Großbuchstaben zu beginnen.
function Freundin () {
}
Eine Instanz dieser Klasse erzeugt der Operator new, indem er zusammen mit der dann als Konstruktor bezeichneten Funktion verwendet wird. Die folgende Anweisung erzeugt eine erste Instanz der Klasse Freundin.
meineFreundin = new Freundin();
Auf dieselbe Art und Weise legen Sie beliebig viele weitere Instanzen an:
meineFreundin = new Freundin();
deineFreundin = new Freundin();
exFreundin = new Freundin();
kurschatten = new Freundin();
Da sich sämtliche mit this versehene Anweisungen in der Funktion Freundin auf die gerade geschaffene Instanz beziehen und die Funktion beim Aufruf mit new einmal abgearbeitet wird, ist die Initialisierung der Instanz ein Leichtes:
function Freundin (name) {
this.name=name;
}
meineFreundin = new Freundin("Sandra");
trace(meineFreundin.name);
Letztendlich lassen sich auch die Methoden so definieren. Doch dadurch erhält jede Instanz eine Kopie der Fähigkeiten:
function Freundin (name) {
this.name=name;
this.noergle = function () {
trace("Menno!");
};
}
meineFreundin = new Freundin("Sandra");
meineFreundin.noergle();
deineFreundin = new Freundin("Veronika");
deineFreundin.noergle();
Prototype
Die Prototype-Eigenschaft des Funktionsobjektes ermöglicht es, einer Klasse beliebig viele Fähigkeiten (Methoden) hinzuzufügen.
Alternativ bietet sich das Prototypen-Objekt der Klasse an. Dort abgelegte Methoden sind allen Instanzen bekannt und benötigen so nur einmal Speicherplatz. Zusätzlich ermöglicht diese zweite Variante das Variieren einer Fähigkeit der gesamten Klasse zur Laufzeit, indem die Methode innerhalb des Prototypen geändert wird – aus der Sicht von Programmierern von klassenbasierten Sprachen wie Java ist diese zugegebenermaßen unübersichtliche Dynamik zur Laufzeit aber eher schlechter Stil:
function Freundin (name) {
this.name=name;
}
Freundin.prototype.noergle = function () {
trace("Menno!");
};
meineFreundin = new Freundin("Sandra");
meineFreundin.noergle();
Dieser Prototyp ist eine der mächtigsten Eigenschaften in ActionScript, da er wesentliche Elemente der Objektorientierung wie z.B. die Vererbung erst möglich macht. Das nächste Kapitel widmet sich anhand eines Beispiels mit Männern ausführlich diesem Thema.
|