一.对象和类型
ActionScript 3.0中,所有的类(无论是内置类还是用户定义的类)都是从 Object 类派生的。
但是,Object 数据类型不再是默认的数据类型,尽管其它所有类仍从它派生。
在 ActionScript 2.0 中,下面的两行代码等效,因为缺乏类型注释意味着变量为 Object 类型:
var
someObj:Object;
var
someObj;
但是,ActionScript 3.0 引入了无类型变量这一概念,默认的数据类型是无类型变量:
var
someObj:
*
;
var
someObj;
无类型变量与 Object 类型的变量不同,二者的主要区别在于无类型变量可以保存特殊值undefined,而
Object类型的变量则不能保存该值。
可以使用 class 关键字来定义自己的类。在方法声明中,可通过以下三种方法来声明类属性 (property):
1.用 const 关键字定义常量;
2.用 var 关键字定义变量;
3.用 get 和 set 属性(attribute) 定义 getter 和 setter 属性 (property);
可以用 function 关键字来声明方法。
可使用 new 运算符来创建类的实例:var myFreeDay:Date = new Date();
Java允许将嵌套类声明为私有,而 ActionScript 3.0 则不同,它既不支持嵌套类也不支持私有类。
二.包和命名空间
包:
包的作用是组织代码并防止名称冲突:
package samples
{
public class SampleCode
{
public
var
sampleGreeting:String;
public
function
sampleFunction()
{
trace(
"
this is samples
"
+
sampleGreeting
+
"
from sampleFunction()
"
);
}
}
}
package samples2
{
public class SampleCode
{
public
var
sampleGreeting:String;
public
function
sampleFunction()
{
trace(
"
this is samples2
"
+
sampleGreeting
+
"
from sampleFunction()
"
);
}
}
}
使用:
samples.sampleGreeting 或者samples.sampleFunction()
samples2.sampleGreeting 或者samples2.sampleFunction()
命名空间:
命名空间可以控制所创建的属性和方法的可见性。请将 public、private、protected和 internal 访问
控制说明符视为内置的命名空间。如果这些预定义的访问控制说明符无法满足您的要求,您可以创建自己
的命名空间。
定义命名空间:
命名空间中包含一个名为统一资源标识符 (URI) 的值,该值有时称为命名空间名称。使用
URI 可确保命名空间定义的唯一性。
可通过两种方法来声明命名空间定义,以创建命名空间:
1.使用显式 URI 定义命名空间:
namespace flex_proxy
=
“http:
//
www.adobe.com/flex/proxy”;
2.省略 URI:
namespace flex_proxy;
如果您省略 URI (如下面的示例所示),则编译器将创建一个唯一的内部标识字符串来代替 URI。您对于
这个内部标识字符串不具有访问权限。
应用命名空间:
正如使用 public 访问控制命名空间声明的函数。在函数的定义中使用 public 属性会将该函数放在 public
命名空间中,从而使该函数对于所有的代码都可用。在定义了某个命名空间之后,可以按照与使用 public
属性相同的方式来使用所定义的命名空间,该定义将对于可以引用您的自定义命名空间的代码可用。
namespace example1;
class someClass
{
example1 myFunction() {}
}
引用命名空间:
在使用借助于任何访问控制命名空间(如 public、private、protected 和 internal)声
明的方法或属性时,无需显式引用命名空间。这是因为对于这些特殊命名空间的访问由上下
文控制。例如,放在 private 命名空间中的定义会自动对于同一个类中的代码可用。但是,
对于您所定义的命名空间,并不存在这样的上下文相关性。要使用已经放在某个自定义命名
空间中的方法或属性,必须引用该命名空间。
可以用 use namespace 指令来引用命名空间,也可以使用名称限定符 (::) 来以命名空间限
定名称。
use namespace example1;
myFunction();
//
或者
example1::myFunction();
为什么使用命名空间:
1.拥有单独的命名空间可提高代码的可读性;
2.子类中包含名称与基类方法的名称相同的实例方法时,使用命名空间可避免名称冲突,例如
以下就是可接受的代码:
dynamic class MyProxy extends Proxy
{
public
function
callProperty() {}
example1 override
function
callProperty(name:
*
,
rest):
*
{
trace(
"
method call intercepted:
"
+
name);
}
}
3.当您希望以一种无法由四个访问控制说明符(public、private、internal 和 protected)
实现的方式提供对方法或属性的访问时,命名空间也可能会非常有用。例如,您可能有几个
分散在多个包中的实用程序方法。您希望这些方法对于您的所有包均可用,但是您不希望这
些方法成为公共方法。为此,您可以创建一个新的命名空间,并将它用作您自己的特殊访问
控制说明符。
下面的示例使用用户定义的命名空间将两个位于不同包中的函数组合在一起。通过将它们组
合到同一个命名空间中,可以通过一条 use namespace 语句使这两个函数对于某个类或某
个包均可见。我们使用四个文件来说明此方法:
//
example 文件夹中的 myInternal.as 此文件用来定义 myInternal 命名空间
package example
{
public namespace myInternal
=
"
http://www.adobe.com/2006/actionscript/
examples
"
;
}
//
example/alpha 文件夹中的 Utility.as,第一个类,该文件应放在 example 文件夹下的alpha 子文件夹中
package example.alpha
{
import example.myInternal;
public class Utility
{
private static
var
_taskCounter:
int
=
0
;
public static
function
someTask()
{
_taskCounter
++
;
}
myInternal static
function
get taskCounter():
int
{
return
_taskCounter;
}
}
}
//
example/beta 文件夹中的 Helper.as,第二个类,该文件应放在 example 文件夹下的 beta 子文件夹中
package example.beta
{
import example.myInternal;
public class Helper
{
private static
var
_timeStamp:Date;
public static
function
someTask()
{
_timeStamp
=
new
Date();
}
myInternal static
function
get lastCalled():Date
{
return
_timeStamp;
}
}
}
//
NamespaceUseCase.as 主应用程序类,应放在 example 文件夹的同级,导入 myInternal 命名空间,
//
并使用它来调用位于其它包中的两个静态方法。
package
{
import flash.display.MovieClip;
import example.myInternal;
//
导入命名空间
import example.alpha.Utility;
//
导入 Utility 类
import example.beta.Helper;
//
导入 Helper 类
public class NamespaceUseCase extends MovieClip
{
public
function
NamespaceUseCase()
{
use namespace myInternal;
Utility.someTask();
Utility.someTask();
trace(Utility.taskCounter);
//
2
Helper.someTask();
trace(Helper.lastCalled);
//
[ 上次调用 someTask() 的时间]
}
}
}