2008-10-11 61 views
2

如果我有這樣的方法:Flex 3方法可以檢測調用對象嗎?

private function testMethod(param:string):void 
{ 
    // Get the object that called this function 
} 

的TestMethod的裏面,我可以制定出什麼對象叫我們?例如

class A 
{ 
    doSomething() 
    { 
    var b:B = new B(); 
    b.fooBar(); 
    } 
} 

class B 
{ 
    fooBar() 
    { 
    // Can I tell that the calling object is type of class A? 
    } 
} 

回答

6

對不起,答案是否定的(見下面的編輯)。函數收到一個名爲arguments的特殊屬性,在AS2中,它使用的屬性爲caller,該屬性大致可以滿足您的需求。雖然參數對象在AS3中仍然可用,但調用者屬性已從AS3(因此是Flex 3)中移除,因此沒有直接的方法可以執行所需操作。它也特別建議您使用[...其餘參數(http://livedocs.adobe.com/flex/3/langref/statements.html#..._(rest)_parameter)語言特性,而不是arguments

這裏是一個reference on the matter(搜索被叫找到相關細節)

編輯:。進一步的調查顯示,有可能獲得當前執行功能的堆棧跟蹤,因此如果幸運的話,可以使用該功能做些事情。請參閱this blog entrythis forum post以瞭解更多詳細信息。你拋出一個錯誤,然後立即捕獲它然後解析堆棧跟蹤。醜,但它可能適合你。從博客文章

代碼:


var stackTrace:String; 

try { throw new Error(); } 
catch (e:Error) { stackTrace = e.getStackTrace(); } 

var lines:Array = stackTrace.split("\n"); 
var isDebug:Boolean = (lines[1] as String).indexOf('[') != -1; 

var path:String; 
var line:int = -1; 

if(isDebug) 
{ 
    var regex:RegExp = /at\x20(.+?)\[(.+?)\]/i; 
    var matches:Array = regex.exec(lines[2]); 

    path = matches[1]; 

    //file:line = matches[2] 
    //windows == 2 because of drive:\ 
    line = matches[2].split(':')[2]; 
} 
else 
{ 
    path = (lines[2] as String).substring(4); 
} 

trace(path + (line != -1 ? '[' + line.toString() + ']' : '')); 
+0

嗯,很好的答案我不確定我喜歡拋出和捕獲這樣一個錯誤的想法,我可能只需要將「thisObject」作爲參數傳遞給我的函數(這樣我就可以使用Function.call()方法) – 2008-10-11 23:22:00

1

我第二次的明確傳遞一個「callingObject」參數的想法。除非你在做非常棘手的事情,否則無論如何,調用者應該能夠提供目標對象。 (對不起,如果這看起來很明顯,我不能告訴你想要完成什麼。)

1

要添加到James有些模糊的第一段:arguments屬性在Function對象內仍然可用,但調用者財產已被刪除。

下面是該文檔的鏈接:http://livedocs.adobe.com/flex/3/langref/arguments.html

+0

感謝您的提示 - 我已經更新了我的答案以包含該信息 – 2008-10-12 07:44:08

4

重要的是要知道堆棧跟蹤僅在Flash播放器的調試器版本。抱歉! :(

1

這可能幫助別人,我不知道......但如果是使用Event這是可能使用e.currentTarget如下:

private function button_hover(e:Event):void 
{ 
     e.currentTarget.label="Hovering"; 
} 
相關問題