Actionscript 3 在AS3中按类名获取实例
我需要根据一个特定的类名获取我的阶段中的所有实例。我正在这样做:Actionscript 3 在AS3中按类名获取实例,actionscript-3,flash-cs5,Actionscript 3,Flash Cs5,我需要根据一个特定的类名获取我的阶段中的所有实例。我正在这样做: var class_ref:Class = getDefinitionByName('fran.MyOwnClass') as Class; var element; for (var i:uint = 0; i < this.parent.numChildren; i++) { element = this.parent.getChildAt(i); if (element is class_ref)
var class_ref:Class = getDefinitionByName('fran.MyOwnClass') as Class;
var element;
for (var i:uint = 0; i < this.parent.numChildren; i++)
{
element = this.parent.getChildAt(i);
if (element is class_ref)
{
trace('Found element of class fran.MyOwnClass');
}
}
var class\u ref:class=getDefinitionByName('fran.MyOwnClass')作为类;
var元素;
for(变量i:uint=0;i
但是我想要一个更好的方法(更有效,不检查所有MCs)。有可能吗?您可以通过扩展容器类并重写其
addChild()
、addChildAt()
、removeChild()
和removeChildAt()
函数来保留特定类型的所有MC的列表
public class MySprite extends Sprite {
public var ownClasses:Vector.<MyOwnClass> = new Vector.<MyOwnClass>();
override public function addChild(child:DisplayObject):DisplayObject {
addOwnClass(child as MyOwnClass);
return super.addChild(child);
}
override public function addChildAt(child:DisplayObject, index:int):DisplayObject {
addOwnClass(child as MyOwnClass);
return super.addChildAt(child, index);
}
private function addOwnClass(child:MyOwnClass):void {
if (child) ownClasses.push(child);
}
override public function removeChild(child:DisplayObject):DisplayObject {
removeOwnClass(child as MyOwnClass);
return super.removeChild(child);
}
override public function removeChildAt(index:int):DisplayObject {
removeOwnClass(getChildAt(index) as MyOwnClass);
return super.removeChildAt(index);
}
private function removeOwnClass(child:MyOwnClass):void {
if (child) {
var i:int = ownClasses.indexOf(child);
if (i != -1) ownClasses.splice(i, 1);
}
}
}
这将输出
[object MyOwnClass]
如果您可以从应用程序生命的一开始就开始跟踪实例,我建议您只需添加事件侦听器:
// in document class constructor, before doing anything else
stage.addEventListener(Event.ADDED, stage_addedHandler);
stage.addEventListener(Event.REMOVED, stage_removedHandler);
private function stage_addedHandler(event:Event):void
{
var obj:DisplayObject = event.target as DisplayObject;
// do something, e.g. if (obj is MyClass) objCounter++;
}
...
如果无法从头开始跟踪,则无法避免循环。。只是让它们更优化:
var n:int = container.numChildren;
while (n-- > 0)
{
...
}
重写随处可见的addChild()和其他类-这在实际项目中是不可能的解决方案。我可以想出其他方法来检查它是否是正确的类,但我认为您无法避免循环。也许如果您重写容器的
addChild()
,您可以在那里执行检查?@RIAstar重写不是我想要的,因为我需要检查我在下面说的内容,以便在找到元素时执行操作。或者我不明白你说的话(我已经是AS3的新手了)。
var n:int = container.numChildren;
while (n-- > 0)
{
...
}