as3中的这个和阶段

Saa*_*aad 1 flash actionscript-3

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

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

然后是什么之间的差异

this.addChild()
stage.addChild()

什么类型的对象是"这个"

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

var mc:Derp = new Derp(this)

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

Cam*_*ron 9

类的内部成员,this指的是调用成员函数的当前实例(因此它始终与类的类型相同).例如,如果你有一个带有成员函数的类Twang func:

var twang1:Twang = new Twang();
twang1.func();        // Inside func(), "this" will refer to twang1
Run Code Online (Sandbox Code Playgroud)

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

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

addChild(foo);
this.addChild(foo);
Run Code Online (Sandbox Code Playgroud)