舞台上的对象不在构造函数外部初始化

时间:2012-12-07 11:30:11

标签: actionscript-3 constructor flash-cs6

在我的文档类中我已经为一个数组分配了一些放在舞台上的对象,所以我可以稍后调用它们。

当我在构造函数外部声明数组时,尚未创建对象,并且赋值值为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
       }
   }
}

enter image description here enter image description here enter image description here

3 个答案:

答案 0 :(得分:3)

全局变量(即任何方法以外的变量)之前加载,之后加载 之前执行

请改用此代码:

package { 
   public class Document extends MovieClip {
       var obj:Array;
       public function Document() {
          obj = [object1,object2];
          trace(obj[0]);
       }
   }
}

<强>附录:

舞台对象在构造函数代码的顶部初始化,例如设计器对象在 .net 中。

因此,由于全局变量在之前初始化为构造函数代码的执行,object1object2仍为null

ADDENDUM 2:

您有以下顺序:

  1. 类的构造函数称为
  2. 全局变量已初始化(您的obj数组以及object1 / object2变量,但不是它们的值)
  3. 设计器(舞台上的图形)对象已初始化(即调用object1 = new Object1()
  4. 执行构造函数代码
  5. 除非您在高级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中,对象也不仅仅存在)