Actionscript 3 阶段上的对象未在构造函数外部初始化
在我的Document类中,我为数组分配了一些放置在stage上的对象,以便以后调用它们 当我在构造函数外部声明数组时,对象尚未创建,赋值为null,这与我在构造函数内部声明它们时不同。 为什么会发生这种情况 如何避免这种情况?我可以使用侦听器跟踪加载对象的时间吗 第一例Actionscript 3 阶段上的对象未在构造函数外部初始化,actionscript-3,constructor,flash-cs6,Actionscript 3,Constructor,Flash Cs6,在我的Document类中,我为数组分配了一些放置在stage上的对象,以便以后调用它们 当我在构造函数外部声明数组时,对象尚未创建,赋值为null,这与我在构造函数内部声明它们时不同。 为什么会发生这种情况 如何避免这种情况?我可以使用侦听器跟踪加载对象的时间吗 第一例 包{ 公共类文档扩展了MovieClip{ var-obj:Array=[object1,object2]; 公共职能文件(){ trace(obj[0]);//在构造函数外部声明数组,并在构造函数内部填充值 public c
包{
公共类文档扩展了MovieClip{
var-obj:Array=[object1,object2];
公共职能文件(){
trace(obj[0]);//在构造函数外部声明数组,并在构造函数内部填充值
public class Document extends MovieClip {
var obj:Array;
public function Document() {
obj = [object1,object2];
trace(obj[0]); // <-- reference value
}
}
public类文档扩展了MovieClip{
var-obj:数组;
公共职能文件(){
obj=[object1,object2];
trace(obj[0]);//全局变量(即任何方法之外的变量)在调用构造函数之后和执行构造函数之前加载到任何对象之前
请改用此代码:
package {
public class Document extends MovieClip {
var obj:Array;
public function Document() {
obj = [object1,object2];
trace(obj[0]);
}
}
}
附录:
阶段对象在构造函数代码的顶部初始化,就像设计器对象在.net中一样
因此,由于全局变量是在构造函数代码执行之前初始化的,object1
和object2
仍然是null
附录2:
您有以下顺序:
类的构造函数被调用
全局变量已初始化(您的obj
数组,以及object1
/object2
变量,但不是它们的值)
设计器(舞台上的图形)对象已初始化(即调用object1=newobject1()
)
构造函数代码被执行
阶段对象总是自动声明和初始化的,除非您在高级设置中取消选中自动声明阶段实例。这有点模糊。这些对象在哪里实例化?
我建议确保它们在您的类中实例化:
package
{
public class Document extends Sprite //I don't think you really need MovieClip
{
//alternatively to the method bellow you could use something like:
//
// private var object1 : Object = new Object();
// private var object2 : Object = new Object();
// public var obj : Array = [object1, object2];
//
// just make sure they are instantiated before they are used in the obj contructor
public var obj : Array = [new Object(),new Object()]; //again here I would suggest using a vector if they are the same type
public function Document()
{
trace(obj[0]);
}
}
}
如果这些对象在类外部,我建议将它们传递给构造函数,如下所示:
package
{
public class Document extends Sprite //I don't think you really need MovieClip
{
public var obj : Array = [null,null]; //again here I would suggest using a vector if they are the same type
public function Document(o1:Object=null,o2:Object=null)
{
if (o1 != null)
obj[0] = o1;
if (o2 != null)
obj[1] = o2;
//
if (obj[0] != null)
trace(obj[0]);
else
trace("Obj[0] is null");
}
}
}
[稍后编辑]
至于发生这种情况的原因,是因为在数组初始化时,这2个值为null(它们尚未初始化)
[稍后第2版]
OK-Document是flash的根类-很好知道
正如我在评论中所说,即使在stage上,这两个对象在添加到stage之前都不会实例化。因此,我建议收听添加到stage的事件。
如果将它们传递到构造函数外部,则在创建数组时它们将为null,因为它们尚未添加到stage/created(与流行的观点相反,即使在Flash中,对象也不存在)我知道答案,我的问题是为什么会发生这种情况?因为在声明中使用代码初始化的所有内容都是先处理的,阶段元素是第二个,构造函数代码是第三个。因此,当构造函数外初始化代码被处理时,object1
和object2
尚未初始化,所以您可以得到空值。@Vesper如果需要,您可以用注释更改当前答案,正确答案是您的。另外,我可以使用事件侦听器onLoad
,someinit()
函数,在舞台上添加了_
或者它是不必要的?不需要在这个上下文中使用这些侦听器。不,他们在舞台上。请阅读问题!在投-1票之前,请实际阅读答案。也就是说,请解释你希望你的类如何真正知道这些对象是谁?你在哪里通过考试提到那些物品?就像我之前说的,在你的问题中要更具体一些,你会得到更准确的答案。投-1票来诋毁别人只会让你被禁止,只要你没有正当的理由这么做。我不想诋毁你,但你的回答不会给帖子增加什么有用的东西。你写道“这有点模糊。这些对象在哪里实例化?”,这意味着您实际上没有阅读这个问题,因为@yannis hristofakis指定对象在舞台上。在Flash中,舞台上的对象会自动声明和初始化(除非您标记了特定选项).我不知道你是从哪里学的flash,但很明显你的老师很糟糕。在flash中,在舞台上声明的对象在该swf中的所有类中都不可用。为了使对象在类中可用,必须对其进行具体实例化//传递给类。即使在舞台上,它们也不会实例化,直到舞台真正显示出来-因此,有Event.INITIALIZE和Event.ADDED_TO_STAGE-我知道你认为这些都是无用的事件,但事实并非如此。哦,还有@teejay,请不要炫耀你对flash的了解有多少。Document class是主STAGE类的通用名称,因为flash CS3,所以不需要假设。你能解释一下为什么文档构造函数在放置阶段对象之前调用?对象是文档的子对象,因此必须在它们之前创建文档。我发现最容易将其视为阶段(如IDE文档中放置对象的位置)继承自Document类。这意味着在子类(IDE阶段)实例化之前,Document类对阶段上声明的对象没有任何概念。@DaveHart非常好的解释,有什么方法可以证明对象是在阶段上创建的,还是在调用构造函数时隐含的?
package
{
public class Document extends Sprite //I don't think you really need MovieClip
{
//alternatively to the method bellow you could use something like:
//
// private var object1 : Object = new Object();
// private var object2 : Object = new Object();
// public var obj : Array = [object1, object2];
//
// just make sure they are instantiated before they are used in the obj contructor
public var obj : Array = [new Object(),new Object()]; //again here I would suggest using a vector if they are the same type
public function Document()
{
trace(obj[0]);
}
}
}
package
{
public class Document extends Sprite //I don't think you really need MovieClip
{
public var obj : Array = [null,null]; //again here I would suggest using a vector if they are the same type
public function Document(o1:Object=null,o2:Object=null)
{
if (o1 != null)
obj[0] = o1;
if (o2 != null)
obj[1] = o2;
//
if (obj[0] != null)
trace(obj[0]);
else
trace("Obj[0] is null");
}
}
}