В AS3 EventDispatcher
является реализацией проекта наблюдателя шаблона. Этот класс реализует методы addEventLister
, removeEventListener
, dispatchEvent' and
hasEventListener`. Внутри он также поддерживает словарь или аналогичную структуру данных, которая содержит события, которые в настоящее время прослушиваются, и список методов, которые нужно вызывать при отправке события. Что-то вроде этого -
{"event1": [method7, method5, method3], "event2": [method3, method2], "event3": [method1]};
Когда addEventListener
вызывается на объект, он создает новый ключ для рассматриваемого события и добавляет ссылки на метод для связанного списка значений.
Когда dispatchEvent
вызывается классу, он извлекает все методы, связанные с событием, и вызывает методы, связанные с ним. Каждый метод вызывается с экземпляром класса Event
или его подклассов.
Удаление прослушивателя событий, очевидно, делает противоположное тому, что добавляет.
Ну, теперь ** я ** не получаю что-то. Как Flash Player знает, какой объект должен быть объектом события, например, при событии щелчка мыши? Какие точные методы используются для определения фактической цели? То же самое для перемещения, проверяет ли объект на предмет затенения другими объектами или нет? Это можно сделать с помощью фильтрации 'getObjectsUnderPoint()' для самого верхнего 'IEventDispatcher' и обозначить его как цель, но в основном это дикая догадка. – Vesper
Hello Romi. Эта строка из вашей ссылки объясняет, что происходит для экранных объектов, и в основном отвечает на мой вопрос. Но как насчет объектов без отображения? - «Когда Adobe® Flash® Player отправляет объект« Событие », этот объект« Событие »совершает круговое путешествие из корня списка отображения на целевой узел, проверяя каждый узел для зарегистрированных слушателей». Хотя я могу представить аналогичную «поездку туда и обратно» для объектов без отображения. – shwell