在AS3中使用全局对象(global)

来源:互联网 发布:红外线遥控器软件 编辑:程序博客网 时间:2024/06/06 02:26

(本文适用于ActionScript 3)
(如若转载, 请留下作者frogcjn的Blog链接:http://blog.csdn.net/frogcjn/)
© 2007,2008 frogcjn


在AS3之前, 通常使用下列语句来动态访问自定义类.

global.className;

global["className"];//动态访问的方法

而在AS3中, Object及其子类中, 根本没有global这个属性。所以要动态访问自定义类可就难了。
例如在名为Test.fla的FLASH文件中, 设置它的"Document class"为Test.as , 然后编辑Test.as, 再按"ctrl+enter"运行.

Test.as 内容:

package{
   import flash.display.*;
      public class Test extends MovieClip{
         public functionTest(){
            var a = Math.floor(Math.random()*3);//随机设定a的值为0,1或2
            trace(a);//输出数字a
            trace(global["Class"+a]);//在这里本打算动态访问ClassN,
                                    //正确的话应该输出"[classclassN]".
                                    //可是由于没有global这个属性,
                                    //却输出"ReferenceError: Error #1065: 变量 global 未定义".
         }
      }
      public class Class0{
      }
      public class Class1{
      }
      public class Class2{
      }
} 

我的解决方法是在"package{}"之后加入"var global = this;", 这样就可以动态访问在"package{}"内部自定义的类了。例如在名为Test.fla的FLASH文件中, 设置它的"Document class"为Test2.as
Test2.as 内容:

package{
   import flash.display.*;
      public class Test2 extends MovieClip{
         public functionTest2(){
            var a = Math.floor(Math.random()*3);//随机设定a的值为0,1或2
            trace(a);//输出数字a
            trace(global["Class"+a]);//由于声明了global指向本package,所以正确输出"[classclassN]"
         }
      }
      public class Class0{
      }
      public class Class1{
      }
      public class Class2{
      }
}
var global = this; 
.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }

那么在主时间轴上是否也可以访问在Test2.as中声明的global呢?
在Test.fla文件的第一帧写:

trace(global);

按"ctrl+enter"运行时输出"[object global]", 所以 global 也可以在主时间轴上使用。
那么Top level(顶级)类 (如 Math、String、Number类都是顶级类)是否也可以通过声明的global动态访问呢?

你可以用下列语句试一试:

trace(global.Math);//输出"undefined"

答案是否定的, 看来,global只能访问"package{}"内部的对象。