2010-12-21 90 views
3

我有2個類代表2個對象。從「whoCalledMe」函數中,我想找出哪個對象叫做函數(不需要將這些信息作爲參數傳遞)。我使用了一個虛構的屬性,「調用者」,這會給我參考我正在尋找。有沒有一種通用的方式,我可以從那裏獲得對調用者的引用?獲取對方法調用者的引用的一般方法?

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

哇,這個問題很可怕......我在做什麼?不要在「循環/循環依賴」或「有向無環圖」中這樣做。 – Pup 2015-08-25 01:09:56

回答

3

這將有助於知道爲什麼你需要這個,因爲我有一種感覺,你不真的。如果該方法是匿名的,你可以使用。適用於該方法綁定「這個」關鍵詞:

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" 

如果方法然而一個實例方法的方法,這是一個綁定的方法,因此「這個」永遠指向它聲明的類的實例,而不管你是否使用apply方法重新定義它。如果它是一個靜態方法,「this」沒有意義,編譯器會抓住它。

除此之外,沒有辦法將它聲明爲參數。曾經有一個關於參數對象的調用者屬性,但它在AS3發佈時已被棄用。你可以通過arguments.callee獲得對函數本身的引用,但這不是你要求的。

0

我想你想知道在調試目的調用者。如果是這樣,我會建議在方法/函數中設置斷點而不是跟蹤。當代碼中斷時,您可以回溯主叫方等等。在Flash IDE和Flashbuilder中工作。如果你是新來的斷點,谷歌「as3斷點」。

+0

我想知道運行時的目的,而不是調試的目的。 – Pup 2010-12-21 21:28:00

2

在AS3中,您可以拋出一個錯誤,然後解析堆棧跟蹤以查找詳細信息。

您可以檢查這裏的一個例子:

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

如果你想找到被調用函數的名稱,你可以按照這個例子:

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

+0

+1這是要走的路 – Zevan 2010-12-21 21:44:52

+0

不幸的是,我認爲這不適用於發佈運行時。此外,你不會得到調用者的實例,雖然我不清楚這是OP所要求的。 – 2010-12-21 21:46:54