Може ли метод 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)_параметър) езикова функция вместо аргументи.

Ето референция по въпроса (потърсете callee, за да намерите съответните подробности).

Редактиране: По-нататъшно разследване показа, че е възможно да получите проследяване на стека за текущата изпълняваща се функция, така че ако имате късмет, можете да направите нещо с това. Вижте този запис в блог и тази публикация във форума за повече подробности.

Основната идея от публикацията в блога е да издадете грешка и след това да я хванете незабавно и след това да анализирате проследяването на стека. Грозно, но може и да ти свърши работа.

код от публикацията в блога:


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