Почему я не могу вызвать метод super из встроенной функции обработки событий? - PullRequest
1 голос
/ 10 июля 2009

В моем классе есть переопределенная функция, которая добавляет обработчик событий, например:

override public function hide():void {
  ...
  tween.addEventListener(TweenEvent.MOTION_FINISH, function(evt:Event):void {
    ...
    super.hide();
  }, false, 0, true);
}

Это не работает, Flash говорит мне: «1006: супер-выражение может использоваться только внутри методов экземпляра класса». (работает, если перешел на правильный метод экземпляра).

Итак, я хотел бы понять, почему я не могу использовать вызов super.hide(); из моей функции обработчика на месте?

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

Ответы [ 2 ]

6 голосов
/ 10 июля 2009

это так, потому что this в анонимной функции указывает на [object global] ... попробуйте и проследите это ...

теперь функция AS3 заключается в том, что вы можете получить доступ к членам экземпляра изнутри, но это действительно странная функция ... this.myProp не будет работать, тогда как myProp будет ... это какая-то темная магия, которая автоматически создает замыкание ... по какой-то причине оно работает с членами экземпляра, но не с super ...

ИМХО, вы не должны использовать анонимные функции в любом случае, только если они предназначены для прототипирования или в качестве параметров для Array методов, таких как forEach, map, filter и т. П. ...

Greetz

back2dos

2 голосов
/ 24 сентября 2009

Я полагаю, что вы можете записать метод в переменную, которая сохраняется в закрытии анонимного метода. Например:

override public function hide():void {
    ...
    var f:Function=super.hide;
    tween.addEventListener(TweenEvent.MOTION_FINISH, function(evt:Event):void {
        ...
        f();
    }, false, 0, true);
}

Я могу объяснить подробнее, если вы боретесь с концепцией закрытия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...