2010-12-21 6 views
3

Ich habe 2 Klassen für 2 Objekte. Von der Funktion "whoCalledMe" möchte ich herausfinden, welches Objekt die Funktion aufgerufen hat (ohne diese Information als Argument zu übergeben). Ich habe eine erfundene Eigenschaft, "Caller", verwendet, die mir die Referenz geben würde, nach der ich suche. Gibt es einen generischen Weg, von dem ich einen Hinweis auf den Anrufer bekommen kann?Generische Möglichkeit, einen Verweis auf den Aufruf einer Methode zu erhalten?

package { 
    public class ObjectCallingTheFunction { 
     public var IDENTITY:String = "I'm the calling function!"; 

     public function ObjectCallingTheFunction() { 
      var objectWithFunction:ObjectWithFunction = new ObjectWithFunction(); 
      objectWithFunction.whoCalledMe(); 
     } 
    } 
} 

package { 
    public class ObjectWithFunction { 
     public function whoCalledMe():void { 
      trace(caller.IDENTITY); // Outputs: "I'm the calling function!" 
     } 
    } 
} 
+0

Wow, diese Frage ist gruselig ... was habe ich gemacht? Gründe, dies nicht zu tun @ "zyklische/zirkuläre Abhängigkeiten" oder "gerichtete azyklische Graphen". – Pup

Antwort

3

Es würde helfen zu wissen, warum Sie das brauchen, weil ich das Gefühl habe, dass Sie nicht wirklich. Wenn die Methode anonym ist, können Sie binden das ‚dieses‘ Stichwort .apply auf der Methode:

var foo:Function = function(arg:int):void 
{ 
    trace(this); 
}; 

var bar:Object = { 
    toString: function():String { return "bar"; } 
}; 

var baz:Object = { 
    toString: function():String { return "baz"; } 
}; 

foo.apply(bar); // <-- Prints "bar" 
foo.apply(baz); // <-- Prints "baz" 

Wenn die Methode eine Instanzmethode Verfahren ist jedoch, es ist eine gebundene Methode ist und somit „das“ wird immer Zeigen Sie auf die Instanz der Klasse, in der sie deklariert ist, unabhängig davon, ob Sie sie mithilfe der Methode apply neu definieren. Wenn es sich um eine statische Methode handelt, macht "dies" keinen Sinn und der Compiler fängt sie ab.

Abgesehen davon, es gibt wirklich keinen Weg, es als Parameter zu deklarieren. Es gab eine Aufrufereigenschaft für das arguments -Objekt, aber es war veraltet, als AS3 veröffentlicht wurde. Sie können einen Verweis auf die Funktion selbst durch arguments.callee erhalten, aber das ist nicht das, wonach Sie gefragt haben.

0

Ich denke, Sie möchten den Aufrufer im Debug-Zweck wissen. Wenn das der Fall ist, würde ich empfehlen, einen Haltepunkt in der Methode/Funktion zu setzen, anstatt ihn zu verfolgen. Wenn der Code bricht, können Sie den Anrufer zurückverfolgen und vieles mehr. Funktioniert in Flash IDE und Flashbuilder. Google "as3 breakpoints", wenn Sie mit Breakpoints nicht vertraut sind.

+0

Ich möchte zur Laufzeit wissen, nicht zu debuggen Zwecken. – Pup

2

In AS3 können Sie einen Fehler werfen und dann den Stack Trace analysieren, um detaillierte Informationen zu erhalten.

Sie können hier überprüfen, für ein Beispiel:

http://www.actionscript-flash-guru.com/blog/18-parse-file-package-function-name-from-stack-trace-in-actionscript-as3

Wenn Sie die aufgerufene Funktion Namen finden möchten, können Sie diesem Beispiel folgen:

http://www.flashontherocks.com/2010/03/12/getting-function-name-in-actionscript-3/

+0

+1 das ist der Weg zu gehen – Zevan

+0

Leider glaube ich nicht, dass das mit Release-Laufzeiten funktioniert. Außerdem erhalten Sie die Instanz des Aufrufers nicht, obwohl mir nicht klar ist, ob der OP danach gefragt hat. –

Verwandte Themen