Actionscript 3 AS3-将eventListener从类内部和外部添加到继承的属性

Actionscript 3 AS3-将eventListener从类内部和外部添加到继承的属性,actionscript-3,events,inheritance,Actionscript 3,Events,Inheritance,读了一本书,我偶然发现了这个例子: 下面是课堂: package com.learningactionscript3.loading { import flash.display.Loader; import flash.display.LoaderInfo; import flash.events.Event; import flash.events.HTTPStatusEvent; import flash.events.IOErrorEvent; import flash.events.

读了一本书,我偶然发现了这个例子:

下面是课堂:

package com.learningactionscript3.loading {

import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.events.Event;
import flash.events.HTTPStatusEvent;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.net.URLRequest;

public class CustomLoader extends Loader {

    private var _ldrInfo:LoaderInfo;
    private var _path:String;
    private var _verbose:Boolean = false;
    private var _loadedPercent:Number = 0;
    //constructor
    public function CustomLoader(path:String="", 
                                 verbose:Boolean=false) {
        _path = path;
        _verbose = verbose;

        addListeners();

        if (path != null) {
            try {
                this.load(new URLRequest(path));
            } catch (err:Error) {
                trace("Cannot load", _path, err.message);
            }
        }
    }
    //listeners
    private function addListeners():void {
        _ldrInfo = this.contentLoaderInfo;
        _ldrInfo.addEventListener(Event.OPEN,
                                  onOpen, false, 0, true);
        _ldrInfo.addEventListener(ProgressEvent.PROGRESS,
                                  onProgress, false, 0, true);
        _ldrInfo.addEventListener(HTTPStatusEvent.HTTP_STATUS,
                                  onStatusEvent, 
                                  false, 0, true);
        _ldrInfo.addEventListener(Event.INIT,
                                  onInit, false, 0, true);
        _ldrInfo.addEventListener(Event.COMPLETE,
                                  onComplete, false, 0, true);
        _ldrInfo.addEventListener(IOErrorEvent.IO_ERROR,
                                  onIOError, false, 0, true);
        _ldrInfo.addEventListener(Event.UNLOAD,
                                  onUnloadContent, 
                                  false, 0, true);
    }

    public function removeListeners():void {
        _ldrInfo.removeEventListener(Event.OPEN, onOpen);
        _ldrInfo.removeEventListener(ProgressEvent.PROGRESS,
                                     onProgress);
        _ldrInfo.removeEventListener(HTTPStatusEvent.HTTP_STATUS,
                                     onStatusEvent);
        _ldrInfo.removeEventListener(Event.INIT, onInit);
        _ldrInfo.removeEventListener(Event.COMPLETE, 
                                     onComplete);
        _ldrInfo.removeEventListener(IOErrorEvent.IO_ERROR, 
                                     onIOError);
        _ldrInfo.removeEventListener(Event.UNLOAD, 
                                     onUnloadContent);
    }
    //listener methods, getter, and setter
    private function onOpen(evt:Event):void {
        if (_verbose) { trace("Loading begun:", _path); }
    }

    private function onProgress(evt:ProgressEvent):void {
        _loadedPercent = evt.bytesLoaded/evt.bytesTotal;

        if (_verbose) { 
            trace("Loading", _path, 
                  "-- progress (0-1):", _loadedPercent);
        }
    }

    private function onStatusEvent(evt:HTTPStatusEvent):void {
        if (_verbose) { trace("HTTP status:", evt.status); }
    }

    private function onInit(evt:Event):void {
        if (_verbose) { 
            trace("Content initialized. Properties:"); 
            trace("  url:", evt.target.url)
            trace("  Same Domain:", evt.target.sameDomain)
            if (evt.target.contentType == 
                "application/x-shockwave-flash") {
                trace("  SWF Version:", evt.target.swfVersion)
                trace("  AS Version:", 
                      evt.target.actionScriptVersion)
                trace("  Frame Rate:", evt.target.frameRate)
            }
        }
    }

    private function onComplete(evt:Event):void {
        if (_verbose) { trace("Loading complete:", _path); }
    }

    private function onUnloadContent(evt:Event):void {
        if (_verbose) { trace("Unloaded:", _path); }
    }

    private function onIOError(evt:IOErrorEvent):void {
        trace("Loading error:\n", evt.text);
    }

    public function get percentLoaded():Number {
        return _loadedPercent;
    }

    public function set verbose(bool:Boolean):void {
        _verbose = bool;
    }
}
}

问题出在这一行:

_ldrInfo = this.contentLoaderInfo;
一些事件监听器被添加到这个属性的内部…现在一切正常了

现在,在FLA文件的框架中(实例化了该类),添加了一个新的eventListener,其名称与内部创建的相同:

var swfLoader:CustomLoader=新的CustomLoader(“swfToLoad.swf”,true); addChild(swfLoader)

swfLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, 完成后, 假,0,真)


我从这个示例推断,swfLoader.contentLoaderInfo和_ldrInfo=this.contentLoaderInfo引用同一内存位置中的同一对象。因此,您可能会想:“最后添加的事件将覆盖第一个事件(内部添加的事件)。但事实并非如此。两个事件侦听器将按顺序响应。首先是内部侦听器,然后是外部侦听器。这是如何实现的?

为什么不?您可以为一种事件类型添加任意数量的侦听器。它们不会相互覆盖。若要删除侦听器,请使用方法。若要管理调用序列,请使用
优先级
参数

public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void

优先级:int(默认值=0)-事件侦听器的优先级。优先级由带符号的32位整数指定。数字越高,优先级越高。优先级为n的所有侦听器都在优先级为n-1的侦听器之前处理。如果两个或多个侦听器共享相同优先级,则按添加顺序处理。默认的priority为0。

也具有相同名称的回调函数?此外,书中的一条注释说:“示例FLA文件中的事件侦听器与类中的事件侦听器不同。所有的内部侦听器都是类级别的,并且是私有的,因此类之外没有任何东西知道它们的存在。示例FLA文件中的侦听器应用于类实例。“swfLoader.contentLoaderInfo和_ldrInfo不是同一个对象吗?@cubob,它们是同一个实例。这就是为什么添加侦听器时没有区别。