Methoden und Eigenschaften
Bisher waren alle Eigenschaften in unseren Beispielen einfache Werte wie "rover" oder 5. Der Klassenname (z.B. Dog) selbst ist als Eigenschaft definiert, und das Prototyp-Objekt ist eine Eigenschaft der Klasse (Dog.prototype). In Wirklichkeit können wir so ziemlich alles als Eigenschaft in Actionscript definieren. Dies ist ein entscheidender Unterschied zu vielen anderen Programmiersprachen (Java, zum Beispiel), also lassen Sie uns klarstellen was wir unter "Eigenschaft" genau verstehen. In Java oder C++ gibt es eine klare Unterscheidung zwischen Methoden und Eigenschaften, in Actionscript gibt es das nicht. Also was sind nun Methoden?
Methoden sind ähnlich zu Funktionen (Routinen), sie sind allerdings immer zu einer Klasse zugehörig und werden generell von einer Instanz aufgerufen. Sie werden benutzt, um Objekte zu modifizieren und/oder einen berechneten Wert zurückzuliefern. Sie werden nicht zum Erstellen neuer Instanzen benutzt. Methoden benutzen nie Prototypen und haben nie Eigenschaften in ihren Namespace. Sie sind nicht wie Klassen. Sie sind Routinen, die zur Klasse gehören.
Nachdem das gesagt wurde, Methoden sehen ähnlich wie Klassen aus. Sie werden auch als Funktion behandelt, allerdings werden Sie nie durch das "new" Schlüsselwort aufgerufen. Das "this" Schlüsselwort zeigt immer zum Objekt des Aufrufers, nicht zu einem neu erstellten Objekt. Weil sie nicht automatisch ein neues Objekt wie Klassen zurückliefern, können Methoden auch einen Wert zurückliefern (müssen aber nicht), selbst wenn es "void" ist (das ist jedoch keine Voraussetzung oder allgemeine Praktik). Zuletzt sei gesagt, wie Eigenschaften einer Klasse sollten Methodennamen immer mit einem Kleinbuchstaben beginnen. (Manche nutzen auch großgeschriebene Methodennamen und nur kleingeschriebene Eigenschaften - es ist und bleibt Ihre Entscheidung, aber sie sollte zumindest konsistent sein!). Lassen Sie uns ein kurzes Beispiel für Methoden ansehen, wie sie erstellt und aufgerufen werden. - Anschließend werden wir alle Begriffe sortieren die unklar werden könnten:
// Dog
Klasse
Dog = function( age )
{
this.age = age;
this.dogYears = this.calcDogYears( this.age );
}
// Dog method - Errechne Alter in Hundejahren
Dog.prototype.calcDogYears = function( age )
{
return ( this.age * 6 );
}
// Dog method - Hund hat Geburtstag
Dog.prototype.haveBirthday = function( )
{
this.age++;
this.dogYears = this.calcDogYears( this.age );
trace("Happy Birthday!")
}
// eine
Instanz von Dog erstellen
yeller = new Dog( 12 );
trace( yeller.dogYears ); // 72
yeller.haveBirthday( ); // method traces "Happy Birthday!"
trace( yeller.dogYears ); // 78
Die Dog-Methoden werden in diesem Programm auf drei verschiedenen Arten aufgerufen. Können Sie sie finden? "calcDogYears" wird zweimal aufgerufen, einmal vom Dog Konstruktor und einmal von einer anderen Methode im Prototyp. "haveBirthday" wird einmal aufgerufen, direkt von der Instanz. In Methoden referenziert das "this" Schlüsselwort auf das Objekt welches die Methode aufgerufen hat, also können Methoden zum Modifizieren (hinzufügen,löschen,ändern) der aufrufenden Objekte benutzt werden. Alle Eigenschaften die im aufrufenden Objekt verfügbar sind, sind dann mittels "this" Schlüsselwort auch für die Methode verfügbar. Natürlich inkludiert das auch andere Prototyp-Methoden (wie wir innerhalb der haveBirthday Methode ersehen können).
Erkennen Sie, warum man Prototypen immer definiert bevor man Instanzen erstellt? Flash kann keine Methoden aufrufen die noch nicht definiert wurden (auch als "forward referencing" bekannt), da Flash den Code so interpretiert wie er angelierfert wird (und in SWF als Streamformat kann man nichteinmal sicher sein, ob nachfolgender Code überhaupt schon geladen ist). Wenn Sie sich den Klassenkonstruktor oben ansehen, sieht es gegenteilig aus. Die Methode calcDogYears wird vom Konstruktorblock aufgerufen, bevor sie im Prototyp definiert wird. Allerdings wird der Konstruktor nicht ausgeführt solange er nicht aufgerufen wird, das passiert erst indem die Instanz "yeller" erstellt wird. Beim Programmieren können Sie also die Klassen und ihre Prototypen als einheitlichen Block ansehen und sie zusammen definieren. Generell gesagt werden Prototyp-Methoden nach Prototyp-Eigenschaften definiert.
Es ist auch nicht verboten Methoden nur in Instanzen zu definieren (Beispiel Glasebenen), aber eher die Ausnahme. Methoden sind von ihrer Natur her eher statisch im Gegensatz zu Strings oder Nummern, also ist es wahrscheinlich, dass die Methoden in allen Instanzen derselben Klasse gleich bleiben. Manchmal will man Methoden in der run-time neu definieren, indem man sie einem Konstruktor als Argument übergibt. Dies ist die Situation in der man die Methoden einer Instanz sieht. Wenn Sie sich selbst dabei ertappen mit Hilfe mehrerer if-Abfragen Methoden innerhalb eines Konstruktors zu definieren ist es höchste Zeit für eine Subklasse. Wir werden das in kürze erklären.
Funktion vs. Klasse vs. Konstruktor vs. Methode vs. Eigenschaft ... Ugh!
Ok, lieben Sie es, oder nicht, wir werden diese Begriffe nocheinmal kurz klarstellen. In Actionscript ist fast alles gleichzeitig eine Eigenschaft und ein Objekt. Das ist großartig, aber gerade deswegen ist es enorm wichtig die Dinge nicht nur physisch zu definieren, sondern auch nach dem eigentlichen Sinn. Mit diesem Gedanken im Hinterkopf beginnen wir mit Klasse, Methode und Funktion
| |
Weitere Definitionen Klasse - Dies ist die Definition einer Vorlage, um neue Objekte zu generieren. Schlüsselwort: new. Sie inkludiert Prototyp-Definitonen für die Klasse. Sie hat keinen Rückgabewert, weil sie ein neu erstelltes Objekt zurückliefert. Sie wird immer mit dem "new" Operator gestartet und generiert jedesmal eine neue Instanz. Das "this" Schlüsselwort referenziert auf die neu erstellte Instanz. Argumente werden benutzt um jeder Instanz individuelle Eigenschaften zuzuweisen. Methode - ist eine Routine, fast immer werden Sie im Klassen-Prototypen definiert und immer durch ein Objekt aufgerufen (meistens von einer Instanz die direkten Zugriff auf diese Methode hat). Sie kann als Argument und Return-wert übergeben werden. Das "this" Schlüsselwort referenziert auf das Objekt welches die Methode aufgerufen hat. Obwohl Methoden einen Prototypen und einen Namespace besitzen, sollten diese ignoriert werden. Funktion - Sie mögen sich fragen warum "normale" Funktionen hier hereinpassen - solche die keine neuen Objekte erstellen und auch zu keiner Klasse oder Instanz gehören. Naja, sie passen nicht. Wenn Sie OO programmieren wollen, dann werden sie weitestgehend auf Funktionen verzichten. Funktionen die alleine im Raum stehen stammen vom sogenannten "prozeduralen" Programmierstil. Konstruktor - zeigt auf die Klasse die ein neues Objekt generiert. Er zeigt genau auf das Klassennamensobjekt, welches mit dem Block bekannt als "Aktivierungsobjekt" verknüpft ist. Eigenschaften - Technisch gesehen wird alles, was zu einem Objekt hinzugefügt wird, eine Eigenschaft. Das inkludiert also Strings, Nummern, etc. und auch Methoden und andere Objekte. Das Wort "Eigenschaften" suggeriert allerdings sehr häufig nicht-Methoden, also passen Sie mit diesem Begriff auf. Actionscript macht keinen Unterschied zwischen Methoden und "Eigenschaften", aber Sie werden das oft wollen. Eigenschaften werden manchmal auch als Attribute bezeichnet (nur Daten), Variablen (nur Daten), Members (Daten oder Methoden), oder auch fields (nur Daten). Abhängig vom Kontext bedeutet Eigenschaft also entweder alle nicht-Methoden oder aber auch alle Methoden und nicht-Methoden. Members - Dieser Begriff wird häufig für Eigenschaften und Methoden benutzt. Eine Klasse ist wie ein Verein, und alle Teile der Klasse sind Mitglied der Klasse (Members). Objekt
vs. Instanz - Beide stehen für dasselbe, obwohl eine Instanz ein
durch "new" erstelltes Objekt anspricht und Objekt eher allgemein
gemeint ist. Strings, Nummern sind auch Objekte und auch Instanzen, erzeugt
von einem internen String oder Nummern-Konstruktor. |