Flex 3方法可以检测调用对象吗?

时间:2008-10-11 22:16:25

标签: actionscript-3 flex flex3

如果我有一个方法如:

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

在testMethod中,我可以找出一个叫我们的对象吗? e.g。

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?
  }
}

5 个答案:

答案 0 :(得分:6)

对不起答案是否定的(见下面的编辑)。函数收到一个名为arguments的特殊属性,而在AS2中,它曾经拥有的属性caller可以大致按照您的意愿执行。尽管在AS3中仍然可以使用arguments对象,但是从AS3(以及Flex 3)中删除了调用者属性,因此没有直接的方法可以执行您想要的操作。还建议您使用[... rest参数](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() + ']' : ''));

答案 1 :(得分:4)

重要的是要知道stackTrace仅适用于Flash Player的调试版。抱歉! :(

答案 2 :(得分:1)

我的第二个想法是显式传递一个“callingObject”参数。除非你正在做一些非常棘手的事情,否则调用者应该能够更好地提供目标对象。 (对不起,如果这看起来很明显,我不知道你想要完成什么。)

答案 3 :(得分:1)

要添加到James的有点模棱两可的第一段:arguments属性仍然可以在Function对象中使用,但调用者属性已被删除。

以下是文档的链接:http://livedocs.adobe.com/flex/3/langref/arguments.html

答案 4 :(得分:1)

这可能对某些人有帮助,我不确定......但如果使用Event,可以使用e.currentTarget进行此操作,如下所示:

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