Может ли метод 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?
  }
}

person Mark Ingram    schedule 11.10.2008    source источник


Ответы (5)


Извините, ответ отрицательный (см. редактирование ниже). Функции получили специальное свойство под названием arguments, а в AS2 раньше у них было свойство caller, которое делало примерно то, что вы хотите. Хотя объект arguments по-прежнему доступен в AS3, свойство caller было удалено из AS3 (и, следовательно, из Flex 3), поэтому нет прямого способа сделать то, что вы хотите. Также рекомендуется использовать параметр [...rest](http://livedocs.adobe.com/flex/3/langref/statements.html#..._(rest)_parameter) языковая функция вместо аргументы.

Вот справка по этому вопросу (выполните поиск callee, чтобы найти соответствующие подробности).

Изменить: Дальнейшее исследование показало, что можно получить трассировку стека для текущей выполняемой функции, поэтому, если вам повезет, вы сможете что-то с этим сделать. См. эту запись в блоге и < href="http://tech.groups.yahoo.com/group/flexcoders/message/58388" rel="noreferrer">это сообщение на форуме для получения более подробной информации.

Основная идея из сообщения в блоге заключается в том, что вы выдаете ошибку, затем немедленно ее перехватываете, а затем анализируете трассировку стека. Некрасиво, но это может сработать для вас.

код из сообщения в блоге:


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() + ']' : ''));
person James Fassett    schedule 11.10.2008
comment
Хм, хороший ответ. Я не уверен, что мне нравится идея бросать и ловить такую ​​​​ошибку. Возможно, мне просто нужно передать thisObject в качестве параметра моей функции (поэтому я могу использовать метод Function.call()). - person Mark Ingram; 12.10.2008

Важно знать, что stackTrace доступен только в отладочной версии Flash Player. Прости! :(

person Community    schedule 27.01.2009

Я бы поддержал идею явной передачи параметра callingObject. Если вы не делаете действительно сложных вещей, в любом случае лучше, чтобы вызывающая сторона могла предоставить целевой объект. (Извините, если это кажется очевидным, я не могу понять, чего вы пытаетесь достичь.)

person aib    schedule 12.10.2008

Чтобы добавить к несколько двусмысленному первому абзацу Джеймса: свойство arguments все еще доступно внутри объекта Function, но свойство caller было удалено.

Вот ссылка на документы: http://livedocs.adobe.com/flex/3/langref/arguments.html

person Christophe Herreman    schedule 12.10.2008
comment
Спасибо за совет - я обновил свой ответ, чтобы включить эту информацию - person James Fassett; 12.10.2008

Это может кому-то помочь, я не уверен... но если кто-то использует Event, это возможно с помощью e.currentTarget следующим образом:

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