在as3文件中区分它时,我有点困惑
假设我有一个主要阶段链接到Main.as
然后是
之间的差异this.addChild()
stage.addChild()
什么类型的对象是“this”
假设我创建了一个类并传入了一个“this”的实例,所以我可以从MC内部引用阶段
里面的derp是什么?它是通用对象类型吗?var mc:Derp = new Derp(this)
答案 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
显示对象。
stage
是Main
的公共属性,用于存储对舞台的引用。当您使用舞台参考的Sprite
方法添加addChild()
的新实例时,您将该实例添加到舞台而不是Main
显示对象。
简而言之,Main
是舞台的子显示对象。因此,当您执行stage.addChild(new Sprite())
时,stage现在有两个子对象,即新的Sprite
实例和Main
。但是,当您从this.addChild(new Sprite())
课程中Main
时,您正在引用Main
。所以现在舞台上有一个子显示对象Main
,而Main
有一个新的Sprite
实例作为子显示对象。