Страница 1 из 1

Вопрос по поводу ООП и областей видимости.

Добавлено: 27 сен 2012, 16:45
soundy_flash
Здравствуйте, друзья!

Уже довольно давно сижу на сайте, читаю форум. А сейчас я изучаю книгу Колина Мука по языку actionscript 3.0. И вот у меня впервые возник вопрос к более опытным товарищам.

В книге на странице 915 приведён следующий код (перепечатываю без комментариев от автора):

Код: Выделить всё

package {    import flash.display.MovieClip;    import flash.utils.Timer;    import flash.events.TimerEvent;     public class Star extends MovieClip {        private var timer:Timer;         public function Star() {            timer = new Timer(100, 0);            timer.addEventListener(TimerEvent.TIMER, timerListener);            timer.start();        }         private function timerListener(e:TimerEvent) {            randomFade();        }         private function randomFade():void {            alpha = Math.random();        }         public function dospose():void {            timer.stop();        }    }}
Меня интересуют строки с 9 по 21. Поподробнее объясню область своего незнания :)

Программа каждые 50 миллисекунд меняет значения прозрачности для каждой конкретной звезды отдельно. =>
Функция-приёмник "timerListener()" зарегистрирована в объекте Timer данного экземпляра класса Star. =>
У объекта события, передаваемого в функцию, есть переменная экземпляра "target", которая указывает на объект Timer. =>
Функция-приёмник не знает, таймер какого именно экземпляра класса Star вызвал эту функцию. =>
Почему тогда переменная alpha из функции randomFade() знает, для какой именно звезды (экземпляра класса Star) менять степень прозрачности?

Сейчас, во время написания текста, у меня появилась догадка, что функция randomFade, это метод экземпляра, а значит она как-то должна знать, таймер какого именно экземпляра привёл к её вызову. Но это только догадка.

Чтобы у меня в голове не возникло непоправимых пробелов в знаниях, разъясните мне пожалуйста поподробнее, что здесь да как. В чём фишка? Почему переменная alpha меняется именно для того экземпляра, таймер которого привел к вызову функции, меняющей эту переменную?

Re: Вопрос по поводу ООП и областей видимости.

Добавлено: 28 сен 2012, 01:11
sanych_dv
Добавьте ключевое слово this и вам станет все понятно:

Код: Выделить всё

         private function timerListener(e:TimerEvent):void        {            randomFade();                        trace(timer.currentCount, this.timer.currentCount);                }                private function randomFade():void        {            alpha = Math.random();                        trace(this, alpha, this.alpha)                } 
В контексте данного класса выражения timer = new Timer(); и this.timer = new Timer(); будут эквивалентны.
Таким образом, при создании каждого экземпляра класса Star поведение вызванного из него объекта Timer будет определяться только в границах этого экземпляра Star.

В ActionScript 3 именованная функция с закрытием метода всегда будет ссылаться на экземпляр объекта оригинального контекста определения функции.

Re: Вопрос по поводу ООП и областей видимости.

Добавлено: 06 окт 2012, 00:36
soundy_flash
sanych_dv, спасибо. С вашей (и не только) помощью я разобрался в своём вопросе.