Actionscript 3 AS3是否在后台获取类的所有实例的数组?

Actionscript 3 AS3是否在后台获取类的所有实例的数组?,actionscript-3,function,instances,Actionscript 3,Function,Instances,假设我已经定义了myCircle类等等。如果我的代码如下: var circle1:myCircle = new myCircle() var circle2:myCircle = new myCircle() var circle3:myCircle = new myCircle() var circle4:myCircle = new myCircle() stage.addChild(circle1) stage.addChild(circle2) stage.addChild(circ

假设我已经定义了myCircle类等等。如果我的代码如下:

var circle1:myCircle = new myCircle()
var circle2:myCircle = new myCircle()
var circle3:myCircle = new myCircle()
var circle4:myCircle = new myCircle()

stage.addChild(circle1)
stage.addChild(circle2)
stage.addChild(circle3)
stage.addChild(circle4)

我如何编写一个函数来自动返回[circle1,Circle2,circle3,circle4]数组?

我不会替你做这项工作,但我可以给你一个提示:

您可以通过执行以下操作来检查某个对象是否是myCircle实例

if(child is myCircle)

因此,当您循环遍历阶段的所有子级时,您可以将myCircle实例的子级放入数组中,如果没有,则什么也不做。这将为您提供一个myCircles所有子对象的数组。

很简单,请看我制作的以下内容:

package 
{
    import flash.display.DisplayObject;
    import flash.display.DisplayObjectContainer;
    import flash.display.Sprite;
    import flash.events.Event;

    public class Main extends Sprite 
    {
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            for (var i:uint = 0; i < 5; i++)
            {
                var circle:Circle = new Circle();
                circle.name = "circle" + (i+1);
                stage.addChild(circle);

            }// end for

            for (var j:uint = 0; j < 5; j++)
            {
                var square:Square = new Square();
                square.name = "square" + (j+1);
                stage.addChild(square);

            }// end for

            traceNames(getCircles(stage)); // output: circle1
                                           //         circle2
                                           //         circle3
                                           //         circle4
                                           //         circle5

            traceNames(getSquares(stage)); // output: square1
                                           //         square2
                                           //         square3
                                           //         square4
                                           //         square5


            traceNames(getChildren(stage, Circle)); // output: circle1
                                                    //         circle2
                                                    //         circle3
                                                    //         circle4
                                                    //         circle5

        }// end function

        private function getCircles(container:DisplayObjectContainer):Array
        {
            var array:Array = new Array();

            for (var i:uint = 0; i < container.numChildren; i++)
            if (container.getChildAt(i) is Circle)
            array.push(container.getChildAt(i));

            return array;

        }// end function

        private function getSquares(container:DisplayObjectContainer):Array
        {
            var array:Array = new Array();

            for (var i:uint = 0; i < container.numChildren; i++)
            if (container.getChildAt(i) is Square)
            array.push(container.getChildAt(i));

            return array;

        }// end function

        private function getChildren(container:DisplayObjectContainer, type:Class):Array
        {
            var array:Array = new Array();

            for (var i:uint = 0; i < container.numChildren; i++)
            if (container.getChildAt(i) is type)
            array.push(container.getChildAt(i));

            return array;

        }// end function

        private function traceNames(array:Array):void
        {
            for each(var displayObject:DisplayObject in array)
            trace(displayObject.name);

        }// end function

    }// end class

}// end package

import flash.display.Sprite;

internal class Circle extends Sprite
{
    public function Circle() {}

}// end class

internal class Square extends Sprite
{
    public function Square() {}

}// end class
包
{
导入flash.display.DisplayObject;
导入flash.display.DisplayObjectContainer;
导入flash.display.Sprite;
导入flash.events.Event;
公共类Main扩展了Sprite
{
公共函数Main():void
{
if(stage)init();
else addEventListener(Event.ADDED_TO_STAGE,init);
}//端函数
私有函数init(e:Event=null):void
{
removeEventListener(Event.ADDED_TO_STAGE,init);
对于(变量i:uint=0;i<5;i++)
{
变量循环:循环=新循环();
circle.name=“circle”+(i+1);
阶段。添加儿童(圆圈);
}//结束
对于(变量j:uint=0;j<5;j++)
{
变量平方:平方=新平方();
square.name=“square”+(j+1);
舞台:addChild(广场);
}//结束
traceNames(getCircles(阶段));//输出:circle1
//圆圈2
//圆圈3
//圆圈4
//圆圈5
traceNames(getSquares(stage));//输出:Squares1
//平方2
//平方3
//平方4
//平方5
traceNames(getChildren(stage,Circle));//输出:circle1
//圆圈2
//圆圈3
//圆圈4
//圆圈5
}//端函数
私有函数getCircles(容器:DisplayObjectContainer):数组
{
变量数组:数组=新数组();
for(变量i:uint=0;i
这里的三个关键函数是getCircles()、getSquares()和getChildren()。它们本质上都做相同的事情,函数中有一个
for
循环,循环通过指定的显示对象容器的子对象。每次迭代后,它分别在
getCircles()
getSquares()
函数中检查
Circle
squares
类型,然后将每个显示对象添加到函数返回的本地数组中


getChildren()
函数允许预先指定类型,从而使事情更进一步。

我不明白为什么会被否决,如果投票否决的人能给出一个理由,这样我就可以对我的答案进行适当的修改,那就太好了。@frankhermes its,这样人们就可以简单地将我答案中的代码复制粘贴到他们的document类中并运行它。另外,在我看来,解释它的实际应用更容易理解。但是,您只能显示代码中有趣的部分(例如getCircles),并将完整代码粘贴到gist.github.com上(为了清晰起见)