as3中的这个和阶段

时间:2011-03-16 04:51:23

标签: flash actionscript-3

在as3文件中区分它时,我有点困惑

假设我有一个主要阶段链接到Main.as

然后是

之间的差异
  

this.addChild()
stage.addChild()

什么类型的对象是“this”

假设我创建了一个类并传入了一个“this”的实例,所以我可以从MC内部引用阶段

  

var mc:Derp = new Derp(this)

里面的derp是什么?它是通用对象类型吗?

2 个答案:

答案 0 :(得分:9)

类的内部成员,this引用调用成员函数的当前实例(因此它始终与类的类型相同)。例如,如果您有一个具有成员函数func的类Twang:

var twang1:Twang = new Twang();
twang1.func();        // Inside func(), "this" will refer to twang1

Flash首先创建阶段(类型为Stage),其中必须放置其他所有内容(直接或间接)。然后,它实例化文档类的实例,并将其作为子项放在舞台上。因此,代码中的this永远不会引用该阶段,因为您没有编写Stage类。

由于显示树在Flash中是分层的,当您向已经在舞台上的子对象(至少间接地)添加内容时,它将出现在屏幕上。因此,this.addChild()stage.addChild()之间的差异是对象最终会被插入的容器。

this传递给另一个对象的构造函数时,它将是定义方法(使用this)的类的类型;所以在这种情况下,它将是文档类的类型。

除了将显示对象容器传递给其他对象以便向其添加子对象之外,您可以让您从Sprite继承类(或其他一些DisplayObjectContainer)并将子项添加到自己。然后,您可以将您创建的对象(将包含子对象)添加到舞台上的您自己(文档类实例)。这也提供了更好的封装。

另请注意,如果要直接将子项添加到舞台,则无需将舞台传递给这些对象;他们已经为此目的拥有stage财产。关于该属性的唯一棘手的事情是,在对象实际添加到舞台之前它是空的;所以,你需要一个事件监听器:

public class Car : Sprite {
    public Car() {
        this.addChild(new Wheel());    // Add to self

        this.addEventListener(event.ADDED_TO_STAGE, populateStage);
    }

    private function populateStage():void {
        stage.addChild(new RandomThingToAddToStage());
    }
}

最后,请注意,在大多数情况下,您无需指定this。以下两行是等效的(在类的方法中):

addChild(foo);
this.addChild(foo);

答案 1 :(得分:2)

以下是文档类的示例:

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

    public class Main extends Sprite
    {
        public function Main()
        {
            this.addChild(new Sprite());

            addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);

        }// end function

        public function onAddedToStage(e:Event):void
        {
            stage.addChild(new Sprite());

        }// end function

    }// end class

}// end package

使用上面的示例,this关键字引用当前实例,在此(无双关语)情况下将是Main显示对象。当您在此处调用addChild()方法时,您正在调用addChild()显示对象上的Main方法。此时,当您添加新的Sprite实例时,将其添加到Main显示对象或换句话说this显示对象。

另一方面,

stageMain的公共属性,用于存储对舞台的引用。当您使用舞台参考的Sprite方法添加addChild()的新实例时,您将该实例添加到舞台而不是Main显示对象。

简而言之,Main是舞台的子显示对象。因此,当您执行stage.addChild(new Sprite())时,stage现在有两个子对象,即新的Sprite实例和Main。但是,当您从this.addChild(new Sprite())课程中Main时,您正在引用Main。所以现在舞台上有一个子显示对象Main,而Main有一个新的Sprite实例作为子显示对象。