Actionscript 3 阶段上的对象未在构造函数外部初始化

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

在我的Document类中,我为数组分配了一些放置在stage上的对象,以便以后调用它们

当我在构造函数外部声明数组时,对象尚未创建,赋值为null,这与我在构造函数内部声明它们时不同。 为什么会发生这种情况

如何避免这种情况?我可以使用侦听器跟踪加载对象的时间吗

第一例

包{
公共类文档扩展了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
    ,some
    init()
    函数,
    在舞台上添加了_
    或者它是不必要的?不需要在这个上下文中使用这些侦听器。不,他们在舞台上。请阅读问题!在投-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");
            }
        }
    }