Saa*_*aad 1 flash actionscript-3
在as3文件中区分时,我有点困惑
假设我有一个主要阶段链接到Main.as
然后是什么之间的差异
this.addChild()
stage.addChild()
什么类型的对象是"这个"
假设我创建了一个类并传入了一个"this"的实例,所以我可以从MC内部引用阶段
var mc:Derp = new Derp(this)
里面的derp是什么?它是类型通用对象吗?
类的内部成员,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)