Callee

Innerhalb eines ausgeführten Konstruktors haben Sie automatisch auf zwei Objekte Zugriff. Der Code wird im Aktivierungsobjekt ausgeführt, das wäre schonmal das Erste. Weiters hat der Code eine Referenz auf die Instanz die soeben erstellt wird mit Hilfe des "this" Schlüsselwortes, das wäre das zweite Objekt (natürlich haben aufgrund der Natur von Flash auch mittels "_root" Zugriff auf die Hauptzeitleiste, ignorieren wir das hier). Normalerweise reicht das völlig aus. Wie auch immer, es fehlt die Referenz auf die eigentliche Klasse. Vielleicht glauben Sie das wäre gegeben durch den aktuellen Gültigkeitsbereich, allerdings bezieht sich dieser ja nur auf das Aktivierungsobjekt, und alle hierin erstellten Eigenschaften werden nach dem Durchlauf des Konstruktors ignoriert. - Also ist es klarerweise keine Referenz auf die Klasse. Über das "this" Schlüsselwort kann man versuchen Zugriff darauf zu erhalten (this.constructor, this.__proto__). Wichtig ist jedoch, dass das Schlüsselwort "this" sich immer nur auf die Ersteller-Klasse bezieht, somit ist es ungeeignet für Vererbung über mehrere Ebenen.

Glücklicherweise kann das Problem mit Hilfe von arguments.callee gelöst werden. In Flash 5 war dies noch ein undokumentiertes Feature und ist seit Flash MX auch im Actionscript Dictionary dokumentiert. Wohin genau zeigt nun also callee?

Arguments.callee zeigt auf die Funktion (ja, Klasse oder Methode), zu der das aktuelle Aktivierungsobjekt gehört. So kann ein Konstruktor sehr einfach eine Referenz auf seine Klasse erhalten, indem er arguments.callee anspricht. Eine typische Vorgangsweise wäre jeder Klasse ihren Namen zuzuweisen (z.B. Dog.name = "Dog"), um später mittels trace auszugeben, welcher Klasse der ausgeführte Konstruktor zugehörig ist, z.B.:

trace( arguments.callee.name );

Dies kann zu Debuggingzwecken sehr nützlich sein. Um innerhalb des Aktivierungsobjektes auf den Prototypen der Klasse zuzugreifen reicht ein einfaches arguments.callee.prototype. Ausserdem erlaubt arguments.callee einer Methode ihren Methodennamen festzustellen (arguments.callee).

Hier ist ein Beispielcode mit dem Sie ein wenig experimentieren können. Sie werden feststellen, dass callee für Debuggingzwecke am nützlichsten ist und zum Überprüfen dient.

Class = function()
{
// find Class from constructor
trace( "Class: " + arguments.callee.x );
// Output: Class: Class name object

// find class prototype from constructor
trace( "Class.prototype: " + arguments.callee.prototype.x);
// Output: Class.prototype: Class prototype
}

Class.x = "Class name object";
Class.prototype.x = "Class prototype";

Class.prototype.method = function()
{
// find method name from inside method
trace("method: " + arguments.callee.x);
// Output: method: method name Object

// find 'Class's static property' from method trace("method: " + this.__proto__.constructor.x);
// (only works if class is one level up from instance)
}
Class.prototype.method.x = "method name Object";

aa = new Class(); // test constructor
aa.method(); // test method






Navigation
Einleitung · Objekte · Klassen · Instanzen · Lokal · Vererbung · Prototypen · Overriding · Overwrite · Protection · Argumente · Konstruktor · Methoden · __proto__ · arguments[] · callee · caller