在我的文档类中我已经为一个数组分配了一些放在舞台上的对象,所以我可以稍后调用它们。
当我在构造函数外部声明数组时,尚未创建对象,并且赋值值为null,这与我在构造函数中声明它们时不同。 为什么会发生这种情况?
如何可以避免这种情况?可以我使用侦听器来跟踪何时加载对象?
第一案例
package {
public class Document extends MovieClip {
var obj:Array = [object1,object2];
public function Document() {
trace(obj[0]); // <-- null
}
}
}
第二个案例
package {
public class Document extends MovieClip {
public function Document() {
var obj:Array = [object1,object2];
trace(obj[0]); // <-- reference value
}
}
}
答案 0 :(得分:3)
全局变量(即任何方法以外的变量)在之前加载,在之后加载 之前执行
请改用此代码:
package {
public class Document extends MovieClip {
var obj:Array;
public function Document() {
obj = [object1,object2];
trace(obj[0]);
}
}
}
<强>附录:强>
舞台对象在构造函数代码的顶部初始化,例如设计器对象在 .net 中。
因此,由于全局变量在之前初始化为构造函数代码的执行,object1
和object2
仍为null
。
ADDENDUM 2:
您有以下顺序:
obj
数组以及object1
/ object2
变量,但不是它们的值)object1 = new Object1()
)除非您在高级AS设置中取消选中自动声明舞台实例,否则始终会自动声明和初始化舞台对象。
答案 1 :(得分:0)
在外部声明数组,并在构造函数中填充值。
public class Document extends MovieClip {
var obj:Array;
public function Document() {
obj = [object1,object2];
trace(obj[0]); // <-- reference value
}
}
无论你写什么作为初始值,首先处理,编辑器中嵌入的任何东西是第二,构造函数代码是第三。因此,当您在初始化代码中按名称引用资产时,它们尚未初始化,因此您将收到空值。
您使用的听众只会在对象可用后才会应用。如果您需要阶段引用以将代码控制的资产与给定的阶段维度对齐,init()
和ADDED_TO_STAGE
侦听器非常有用。在此之前,阶段引用为空。
答案 2 :(得分:-2)
这有点模糊。这些对象在哪里实例化? 我建议确保它们在你的课程中实例化:
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");
}
}
}
[LATER EDIT] 至于发生这种情况的原因是因为在数组初始化时这些2是空的(它们尚未初始化)
[LATER EDIT2] 好的 - 文档是闪存的根类 - 很高兴知道 就像我在评论中所说的那样,即使在舞台上,这两个对象在被添加到舞台之前也不会被实例化。因为我建议听ADDED_TO_STAGE事件。 如果你在构造函数之外传递它们,那么在创建数组时它们将为null,因为它们尚未被添加到阶段/创建(与流行的看法相反,即使在Flash中,对象也不仅仅存在)