Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 在AS3中按类名获取实例_Actionscript 3_Flash Cs5 - Fatal编程技术网

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)
{
    ...
}