14.5 prototype, __proto__ und super
Hier klicken, um das Bild zu Vergrößern
Abbildung 14.3
Die Eigenschaften proto und prototype bei Klassen und Instanzen
prototype
Die als Vererbung bezeichnete Arbeitsweise von ActionScript bedient sich eines Konzeptes namens Prototypenkette (auch proto-chain genannt). Jedes Funktionsobjekt besitzt als Eigenschaft ein Prototyp-Objekt (prototype). Diesem Prototyp-Objekt weisen Sie die Methoden oder Eigenschaften zu, die für alle Instanzen einer Klasse gelten sollen:
function Klasse() {
}
Klasse.prototype.eigenschaft = "wert";
Klasse.prototype.methode = function() {
};
Bitte beachten Sie, dass die Eigenschaften im Prototyp-Objekt für alle Instanzen einer Klasse den gleichen Wert beinhalten (z.B. für einen Zähler die Anzahl an Instanzen).
proto
Jede Instanz dieser Klasse erhaelt automatisch eine proto -Eigenschaft, die auf den Prototyp der Konstruktorfunktion zeigt (siehe Abbildung). Wenn Sie nun eine Methode oder eine Eigenschaft bezueglich einer Instanz verwenden, sucht Flash zuerst direkt in der Instanz nach dieser. Sollte sich die gesuchte Methode oder Eigenschaft nicht direkt in der Instanz befinden, dann setzt Flash die Suche in dem Prototypen fort, der in proto -Eigenschaft angegeben ist:
function Klasse() {
}
Klasse.prototype.methode = function() {
};
//
instanz = new Klasse();
// Alles dasselbe
instanz.methode();
instanz.__proto__.methode();
Klasse.prototype.methode();
Die Anweisungen in dem vorherigen Skript machen alle dasselbe mit den folgenden Besonderheiten. Die Anweisung instanz.methode(); führt direkt über die Prototypenkette zur Methode, da in der Instanz selber diese Methode ja nicht definiert ist. Die Anweisung instanz.__proto__.methode(); zeigt direkt auf die Methode im Prototypen und führt diese im Kontext der Instanz aus. Dies unterscheidet diese und die letzte Variante. Denn die letzte Anweisung bezieht sich zwar auch auf diese Funktion, ruft sie aber im Kontext des Prototypen-Objektes auf und hat nichts mehr mit der Instanz zu tun.
Hier klicken, um das Bild zu Vergrößern
Abbildung 14.4
Die Eigenschaften proto und prototype ermöglichen in ActionScript die Vererbung
von Fähigkeiten.
Die Vererbung macht sich das Verhalten von Flash bei der Suche nach Eigenschaften und Methoden zunutze und packt einen Zeiger auf den Prototypen der Oberklasse in die __proto__-Eigenschaft der Unterklasse (siehe Abbildung 14.4). So setzt Flash die Suche nach Methoden und Eigenschaften in der Oberklasse fort, wenn es diese Elemente nicht bereits in der Instanz oder der Unterklasse gefunden hat. Auf diese Art und Weise kann die Prototypenkette beliebig verlängert werden:
function Oberklasse() {
}
Oberklasse.prototype.eigenschaft = "Eigenschaft von Oberklasse";
function Unterklasse() {
}
Unterklasse.prototype = new Oberklasse();
instanz = new Unterklasse();
// Alles dasselbe
trace(instanz.eigenschaft); // Sucht in Instanz
trace(instanz.__proto__.eigenschaft); // Sucht in Prototyp der Unterklasse
trace(instanz.__proto__.__proto__.eigenschaft); // Sucht in Prototyp der Oberklasse
Zugriff auf Methoden/Eigenschaften
Sollten Sie also einmal explizit auf eine Methode oder Eigenschaft irgendwo in der Prototypenkette zugreifen müssen, dann gelingt das – die Kenntnis über die genaue Lage in der Prototypenkette vorausgesetzt – durch die direkte Angabe des __proto__-Pfades in der Form:
meineInstanz.__proto__.__proto__.methode();
super-Operator
Eine ähnliche Funktion wie das von Macromedia verpönte __proto__ übernimmt der super-Operator. Dieser stellt den Bezug zum Prototypen einer Oberklasse her. Die Angabe von super(argumente); ruft dabei die Konstruktormethode der Oberklasse auf. super.methode(argumente); bezieht sich auf die Methode einer Oberklasse. Im Gegensatz zu __proto__ ist der Einsatz von super jedoch auf die Methoden und den Konstruktor der Unterklasse beschränkt.
Hier klicken, um das Bild zu Vergrößern
Abbildung 14.5
Die Verwendung von dem super-Operator
|