Может ли метод Flex 3 обнаружить вызывающий объект? - PullRequest
2 голосов
/ 12 октября 2008

Если у меня есть такой метод, как:

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

Внутри метода testMot я могу определить, какой объект назвал нас? например,

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 ]

6 голосов
/ 12 октября 2008

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

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

Редактировать: Дальнейшие исследования показали, что можно получить трассировку стека для текущей выполняемой функции, поэтому, если вам повезет, вы можете что-то с этим сделать. См. эту запись в блоге и это сообщение на форуме для получения более подробной информации.

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

код из поста в блоге:


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() + ']' : ''));
4 голосов
/ 28 января 2009

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

1 голос
/ 06 июня 2009

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

private function button_hover(e:Event):void
{
      e.currentTarget.label="Hovering";
}
1 голос
/ 12 октября 2008

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

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

1 голос
/ 12 октября 2008

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

...