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,它们是同一个实例。这就是为什么添加侦听器时没有区别。