ActionScript 3 语言简介
ActionScript 3 是一种动态的面向对象的脚本语言,它是(或几乎是)一种类型安全的语言。 ActionScript 3 基于 ECMAScript 3 规范 (ECMA-262) 。另外,其某些功能也是符合 ECMAScript 4 的相关建议。我已经发现采用下列方式对完全是 ActionScript 3 新手的开发人员解释该语言是最容易的: ActionScript 很像 JavaScript 和 Java 的一个混合语言,并且其具有很强的个性。实际上, JavaScript 是另一种基于 ECMAScript 规范的语言,因此,其与 ActionScript 自然而然地具有许多共同点。
正如我前面所述的那样, Flash Player 能够运行两种语言: ActionScript 2 和 ActionScript 3 。 Flash Player 在其内部使用两种不同的虚拟机( Virtual Machine )来协调这两种语言( ActionScript 3 和 AVM2 Virtual Machine 是在 Flash Player 9 中推出的)。 ActionScript 3 是由核心语言 ( 关键字和数据类型等 ) 以及 Flash Player API ( 该 API 使得开发人员能够通过显示列表 API ( display list API )、 3D API 、绘画 API ( drawing API )以及动画( Animation )等 API 使用所有 Flash Player 功能 ) 构成的。在本文中,我将侧重讨论核心语言。点击 这里 ,你可以获得一篇关于 ActionScript 3 的入门佳文。
从现在开始,我将使用缩写 “AS3” 替换 “ActionScript 3” 。
在 PHP 语言中,你可以使用分号 (;) 来隔离或结束一条语句。而在 AS3 语言中,你可以使用分号 (;) 或仅仅行尾符。但我必须说,当我看到不用分号编写的代码时,我的眼睛将不会出现喜悦的目光。因此,我建议你使用与 PHP 使用的相同方法。
PHP 具有下列数据类型:布尔( Boolean )、整数( integer )、浮点数( floating point number )、字符串( String )、数组( Array )、对象( Object )、资源( Resource )和 NULL 。
对于 AS3 来说,我们具有下列数据类型:
· 顶级数据类型:布尔( Boolean )、整数( int )、单元( uint )、数( number )(与 PHP 的浮点数相同)、字符串( String )、 Null ( 仅包含一个值: null ) 和 void ( 仅包含一个值: undefined )
· 复杂数据类型:对象( Object )、数组( Array )、矢量( Vector )(以 Flash Player 10 开头)、字典( Dictionary )、位图( Bitmap )、字节数组( ByteArray )、日期( Date )、 XML 、 XMLList 、函数( Function )、错误( Error )和 RegExp 等。
在 AS3 语言中,一个变量就是与实际值关联的一个标识符或指针。 AS3 中的合法值可以是对象( int 或 uint 是对象, Number 或 Date 也是对象)、 null 和 undefined 。 null 和 undefined 均表示数据缺失,但它们之间存在差别。当你声明一个变量并且你没有对其初始化时,并且如果变量的类型不是 Boolean 、 int 、 uint 或 Number , 则该变量具有值 null 。如果变量没有赋予数据类型并且没有初始化,则该变量具有值 undefined 。同时,当你拥有一个动态对象并且希望检查一个特定的方法或特性( property )是否被定义时,你可以对 undefined 进行检查。
在 PHP 中,你可以按照下面的方式声明一个变量:
在 AS3 中,你可以使用 var 关键词声明一个变量:
注意在该变量名称之后,我添加一个类型注解;例如, myVarName:Boolean ( 该类型是使用 “ : ” 声明的,后面紧跟相应的类型 ) 。在 AS3 中,你可以使用类型注解,也可以不使用类型注解(如果编译器设置为严格模式( strict mode ),则你必须使用类型注解)。
对于 PHP 来说,你不必声明变量的类型,因此,这一点也许显得奇怪,而且你可能希望坚持使用不指定类型的方式编写程序。由于使用类型注解具有诱人的优点,我强烈推荐你使用类型注解。首先,当你使用 IDE 编写代码时,对变量进行分类将使得你在编译时发现更多错误。例如,设想具有一个单一 String 自变量的函数。如果你试图调用该函数,将一个 Object 作为自变量进行传递,则 IDE 将提醒你这是错误。
如果不使用类型注解,你可能会遇到运行时错误,但只能在你或最终用户运行该应用程序时才会发现,并且此时查明软件缺陷的根源将会非常困难。
坚持使用类型注解的第二个原因是,如果 AS3 编译器知道变量的特定类型,则其能够对应用程序进行优化。
在 PHP 中,你能够利用每次赋值改变变量的类型:
在 AS3 中,只有当你使用 “*” 声明变量为 untyped 时,你才能够完成相同当操作(使用严格模式)。
你可能注意到只有当声明变量时我才使用关键词 var 。 对于下一步赋值操作,你可以忽略 var 和类型注解。
正如我前面所述的那样,在 AS3 中变量仅仅是实际值的指针。然而,当你将 int 、 uint 、 Number 、 Boolean 或 String 变量赋值给另一个变量时,将会创建一个副本(对于将这些类型的一个变量传递给一个函数时,情况也是相同的)。在 PHP 中,你可以使用 “&” 运算符通过引用为原语类型进行变量赋值;当你为一个变量改变值时,其它变量将指向相同的改变值。
在 PHP 中,你使用 “.” (dot) 对字符串进行串接,而在 AS3 中,你可以使用 “+” (plus) 完成相同的任务:
在 PHP 中,你可以在任何你期望的位置定义变量:例如在文件级、在函数中或在类中。在 Flex 应用程序中,变量只能在函数中或类级别中声明。
此外,在 PHP 中,你可以编写一段没有在函数中声明的过程化程序代码( procedural programming ):
在 AS3 中,你不能利用函数之外的变量进行任何操作(尽管你可以在函数之外声明变量),但有一个例外,我将在 Class 章节讨论它。因此,如果你试图运行下面的代码,你将在编译该应用程序时出错。
这是你为什么你可以通过重写该代码以便其能够正常运行:
在 PHP 中,可以按照下面方式声明和使用常量。
1: //constants
2: define( "CONSTANT" , "Hello" );
3: $myString = CONSTANT . ‘ world!’;
在 AS3 中,可以使用 const 关键词声明常量(使用大写字母命名常量是一个惯例):
1: static const HELLO:String = "Hello" ;
2: var myString:String = HELLO + " world!" ;
什么可以用于变量的名称呢?对于 PHP 和 AS3 来说,这一点是相似的:只要名称的第一个字符为字母或在 “_” 之后跟随字母、数字或下划线,该名称即为合法名称。对于两种语言来说,下面均是合法变量名称的范例: _1, _a1A, b 。
在 PHP 中,通过了解其字符串名称,你可以使用该变量:
1: <?php
2: $myVar = 12;
3: $varName = 'myVar' ;
4: echo($$varName); //print 12;
5: ?>
在 AS3 中,通过使用引用成员的动态方法(变量 / 方法),你可以获得相似的功能:
在该范例中,我使用了 this 来引用当前对象,但你可以对任何对象使用相同对技巧。当讨论动态类时,我将用更多当篇幅来对此进行说明。
函数和匿名函数(闭包)
在 AS3 中,你可以利用函数实现你可以在 PHP 中实现的每一件事,甚至更多事情。首先,在 AS3 中,你可以定义自变量类型和返回类型(在 PHP 中,你只能从对象添加类型注解至方法)。
你可以将 … (rest) 运算符与显示自变量进行混合,只要你将 … (rest) 运算符作为自变量列表的最后一个元素放置即可: function foo(x:int, y:int, …arguments):Number {} 。当你希望利用自变量中的一个变量成员创建函数时, … (rest) 运算符是非常有用的。
如果函数无需返回任何值,你可以使用 void 作为返回类型。
在 PHP 和 AS3 中,你可以为自变量提供默认值。例如:
当然,你可以在函数中定义函数(你将在下一个代码样本中看到一个范例)。
其次,在 AS3 中,任何函数将被表示为 Function 类的一个实例。这使得某些有趣的事成为可能:
· 你可以创建一个文字函数并且将它赋值给一个变量,然后通过该变量调用该函数(这在 PHP 中也能够实现)。
· 你可以返回一个函数作为另一个函数的执行结果。
当调用其它函数时,你可以将函数作为自变量传递。
在 PHP 和 AS3 中,你可以创建匿名函数(闭包)。在前面的代码样本中,你能够看到一个在 giveMeAFunction() 中创建一个匿名函数然后将其返回的范例。
也许 AS3 和 PHP 的函数之间的最大不同点是你定义它们的方式。在 PHP 中,你可以在文件中定义任意数量的函数。而在 AS3 中,你在一个文件中只能定义一个函数,并且该函数的名称必须与文件的名称相匹配。例如,如果你定义的函数的名称为 doSomeMath() ,则你必须在一个名称为 doSomeMath.as 的文件中创建该函数。在定义函数时,你可以使用类包声明( package declaration )(你将在下一章节学习与包相关的内容)。因此当你希望创建大量工具函数,如果你不希望在大量文件中编写这些代码,则你可以创建一个单一类然后将它们定义为静态方法。
OOP :类和接口
现在是讨论 PHP 和 AS3 的面向对象编程( Object Oriented Programming )功能的时候了。在 PHP 中,你可以编写面向对象或程序化的代码;而 AS3 是面向对象的语言。
让我们从简单 PHP 类开始来看看语法的不同点(记住我使用 PHP 5.3 作为编程参考语言):
下面是它们的主要差异:
· 对存储类的文件进行命名
o 在 PHP 中,你可以在一个文件中定义一个类,而该文件可以以任意方式命名
o 在 AS3 中,文件的名称必须与类的名称相同 (如果类的名称为 SimpleClass ,则文件的名称必须为 SimpleClass.as )
· 命名空间 vs 类包
o 在 PHP 中,你可以使用命名空间以避免类之间的名称冲突
o 在 AS3 中,你可以使用类包;然而,例如,当你在 org.corlan 类包中声明一个类时,这意味着该类将会包含于 Flex 源文件夹的 org/corlan 文件夹中。该包名可以转变为一个文件夹结构。与类访问修饰符( class access-modifier )一起使用的类包能够将该类隐藏至项目之外的类中 ( 后面将会详细讨论 ) 。
· 要求 / 包含 vs. 导入
o 在 PHP 中,通常你可以使用 require_once 函数包含定义类的文件。从 PHP 5 开始,你将能够定义一个 __autoload() 函数,并且在该函数中包含 require_once 或 include_once ,而不需在每个文件的顶部编写一个要求的文件的列表 。
o 在 AS3 中,你可以使用导入语句来包含期望的类。然而,如果你希望从类包 org.corlan 中包含所有类,你可以使用一个通配符编写该导入语句: import org.corlan.* 。另一个不同之处是 AS3 编译器只编译那些在你的代码中实际使用的类 (即只有在特定类的一个实例被实际创建的情形下 ) 。
· 调用方法 / 实例成员 :
o 在 PHP 中,你可以使用 “->” 运算符
o 在 AS3 中,你可以使用 “.” (dot) 运算符
现在,让我们来讨论类 / 方法 / 成员修饰符。
我将从类修饰符开始讨论:
· PHP 具有 final 和 abstract 类修饰符;而 public 是隐式类修饰符,在 PHP 中,所有类均为 public 。
· AS3 具有 public 、 internal 、 final 和 dynamic 类修饰符。如果你没有指定任何访问修饰符( public 或 internal ),则该类默认为 internal ,其含义为该类只能被来自相同类包的类访问。 public 和 final 与 PHP 具有相同的含义。 abstract 在 AS3 中不存在,但你可以使用接口克服这一限制。 Dynamic 标示相应的类通过修改现有成员或添加新的成员能够在运行时进行更改。
类特性( class property )修饰符:
· PHP 具有 public 、 private 、 protected 和 static 修饰符。
· AS3 具有 PHP 修饰符加上 internal 修饰符。 Internal 可用于使得特性( property )只能在相同类包的内部才是可用的。当没有指定修饰符时,可以使用 internal 修饰符。
类方法( class p method )修饰符:
· PHP 具有 public 、 private 、 protected 、 static 、 final 和 abstract 修饰符。
· AS3 具有 public 、 private 、 protected 、 static 、 final 、 internal 和 override 修饰符。 abstract 在 AS3 中不存在; Internal 可以使得方法只能在相同类包的内部的代码中才是可用的。
在 AS3 中,你可以使用函数闭包实现的每一件事均可以使用类函数实现。
PHP 的构造器可以标示为 private ,你可以定义一个具有与类名称相同的构造器,或你可以使用特定的方法 __construct() 和 __destruct() 。在 AS3 中,构造器总是具有 public 修饰符并且必须具有与类相同的名称。如果没有提供任何修饰符,则 AS3 将为你在场景之后创建一个修饰符。
静态成员或静态方法是可以访问的:
· 在 PHP 中,使用 ClassName::propertyName 。
· 在 AS3 中,使用 ClassName.propertyName 。然而,在相同类的内部,你可以省略该类名称。
这里 :
· 在 PHP 中,你可以使用特别的类变量 $this 来指向在相同类中定义的类成员(变量 / 方法): $this->myVar = 22 。
· 在 AS3 中,你可以使用相同的 this : this.myVar = 22 ; 然而,你可以忽略 this , 然后仅使用 myVar = 22 即可。
在 AS3 中,只有一个类能够在类包的内部进行声明(一个 this 类可以给出该文件的名称)。然而,在类包声明的外部,你可以声明任意数量的类:
这将产生一个有趣的效果:所有在类包外部的文件中定义的类将只能在相同文件内部声明的代码中使用。对于所有其它代码,这些类不存在。记住 AS3 的限制,即你不能声明该构造器为 private 。因此,通过使用与该范例相似的方法,你可以确保只存在一个 Foo 类的实例。如果某外部代码调用该构造器时,系统将抛出一个运行时异常,因为外部代码不能使用 Bar 的实例并且该类对于外部代码是不可见的。
继承
在 AS3 中进行类的扩展与在 PHP 中非常相似。你可以使用相同的 extends 关键词后面跟随你希望扩展的类的名称。覆盖( Overriding )功能与 PHP 相同,有一点不同之处是你必须将 override 关键词添加至方法签名。 AS3 不支持重载( Overloading )功能(你不能拥有两个或更多具有相同名称的方法)。
在 PHP 中,你可以使用语句 parent::memberName 访问父成员;而在 AS3 中,你可以使用语句 super.memberName 访问父成员。当执行一个类的构造器时,首先应该调用父构造器。甚至当你没有从你的代码中显式调用父构造器时也会发生父构造器调用。因此,当你在构造器方法中编写代码时,你不能在你的代码之后放置父构造器的调用语句。这样,你可以为父类的正确初始化提供了机会,因此子类将不会使用没有设置的成员。你可以使用语句 super() 调用父构造器。让我们来看看这些工作原理,先看 PHP 代码,然后再看 AS3 代码。
让我们看一下在 AS3 中类是如何初始化的。当一个类被例示时,首先其所有的特性( property )将被初始化,其次在类级别定义的静态代码将被执行(这在 PHP 中是不能执行的),最后构造器将被执行。下面是范例代码:
在 AS3 中,你可以使用函数的原型特性( property )创建函数闭包之外的对象(这与你在 JavaScript 中使用的函数来创建 / 扩展类的情况是相似的)。下面是一个简短范例代码:
在后面的章节中,我将更多地讨论 AS3 的动态功能。
Getters/setters
在任何 OOP 语言中,你通常会使用 getters/setters 来控制你希望向外部暴露的类特性( propert y )。 PHP 也不例外。然而,在 AS3 中,可以使用关键词 set 和 get 对类特性( property )提供特别支持。下面是范例代码:
通常,尽管我使用 setter 和 getter 替代 _salary 字段 ,但我可以调用这些方法,好像它们就是字段或特性( propert y )而不是函数:以 object.salary = 20 替代 object.salary(20) 。如果你选择不对 setter 进行定义,你可以获得只读特性( property )。这就是我使用 _income 特性( property )所实现的功能。
除了使得代码简洁一些之外,该功能还使得编写可以被其它应用程序使用的 API 或类更为简单。假设在我的范例中,我选择创建 _salary 字段作为一个 public 成员。如果后来我决定需要验证能够设置的值,则我必须添加一个 setter 。在 PHP 中,这可能需要使用如 myObject.setSalary() 的语句。此时,任何使用该类的代码将会被破坏;因此,代码必须使用 setter 进行更新。
在 AS3 中,你可以利用定义为 public var salary:int 的特性( property )来启动该类,并且当你决定需要一个 setter 时,你可以对该变量重新命名,然后添加 public function set salary() 方法。使用该类的任何代码将不受这一变更的影响,因为它仍然使用相同的语句 objectInstance.salary = 10 来访问该特性( property )。
在 AS3 中,当使用这种式样的 setter 和 getter 时,有一个惯例是在变量名称前添加一个下划线。
接口
在 PHP 和 AS3 中,接口的工作方式几乎相同。一个显著的差异是在 PHP 中,你可以定义方法以及常量,而在 AS3 中,你只能定义方法。然而,你可以定义 setter/getter :
异常
正如在 PHP 中的那样, AS3 能够支持异常处理:
在 AS3 中,对于所有错误来说, Error 是顶级类。你可以创建自己的错误以扩展该类,或你可以使用现有的子类。
对象类型的转换和测试
有时,你希望将一个对象强制转换为一种不同的类型,或希望检查对象类型。在 PHP 中,你可以使用 instanceof 检查对象的类型,而在 AS3 中,你可以使用 is 检查对象的类型。为了进行类型强制转换,在 AS3 中,你可以使用两种不同的语句。
【国内下载】Flex 3 Builder :http://g.csdn.net/5120749
【国内下载】Adobe Flash Builder 4 :http://g.csdn.net/5105812
【官方下载】Flex 3 Builder :http://g.csdn.net/5121278
【官方下载】Adobe Flash Builder 4 :http://g.csdn.net/5120750
未完待续-----