Если у меня есть такой метод, как:
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?
}
}





К сожалению, ответ отрицательный (см. Правку ниже). Функции получили специальное свойство arguments, а в AS2 оно имело свойство caller, которое могло бы делать примерно то, что вы хотите. Хотя объект arguments по-прежнему доступен в AS3, свойство вызывающего объекта было удалено из AS3 (и, следовательно, Flex 3), поэтому прямого способа делать то, что вы хотите, нет. Также рекомендуется использовать параметр [... rest] (языковая функция http://livedocs.adobe.com/flex/3/langref/statements.html#..._(rest)_parameter) вместо аргументы.
Вот ссылка по делу (найдите вызываемого, чтобы найти соответствующие детали).
Редактировать: Дальнейшее исследование показало, что можно получить трассировку стека для текущей выполняющейся функции, поэтому, если вам повезет, вы можете что-то с этим сделать. Подробнее см. эта запись в блоге и это сообщение на форуме.
Основная идея сообщения в блоге заключается в том, что вы выдаете ошибку, а затем сразу ее ловите, а затем анализируете трассировку стека. Уродливо, но это может сработать для вас.
код из сообщения в блоге:
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() + ']' : ''));
Я бы поддержал идею явной передачи параметра «вызывающий объект». Если вы не делаете действительно сложных вещей, в любом случае для вызывающей стороны должно быть лучше иметь возможность предоставить целевой объект. (Извините, если это кажется очевидным, я не могу сказать, чего вы пытаетесь достичь.)
Чтобы добавить к несколько двусмысленному первому абзацу Джеймса: свойство arguments все еще доступно внутри объекта Function, но свойство caller было удалено.
Вот ссылка на документы: http://livedocs.adobe.com/flex/3/langref/arguments.html
Спасибо за совет - я обновил свой ответ, включив в него эту информацию.
Важно знать, что stackTrace доступен только в отладочной версии Flash Player. Извиняюсь! :(
Это может кому-то помочь, я не уверен ... но если кто-то использует Event, это возможно с помощью e.currentTarget следующим образом:
private function button_hover(e:Event):void
{
e.currentTarget.label = "Hovering";
}
Хм, хороший ответ. Не уверен, что мне нравится идея бросать и ловить такую ошибку. Возможно, мне просто придется передать thisObject в качестве параметра моей функции (чтобы я мог использовать метод Function.call ()).