ActionScript3.0 是一种类型安全,适应标准,面向对象的语言,代表着flash 播放器中的新的程序模型。 如果你已经熟悉ActionScript 1.0或者2.0, 所以当你用 ActionScript3.0开发应用程序时应该注意到它的一些不同点.
为了帮助你轻松过渡到ActionScript3.0,我们开始列出一些信息以及一些在开发过程中你有可能遇到的问题。另一个有关ActionScript 2.0与ActionScript 3.0的API比较的有用资源在《ActionScript 3.0 语言参考》内可以查询到。
1、必须为所有的变量,参数和返回值定义数据类型。
为所有的变量,参数和返回值定义数据类型被认为是一个极好的习惯, 并且能够帮助编译器给你更有帮助的错误提示。因为在运行前虚拟机就已经知道了它(变量,参数和返回值)的数据类型所以它(定义数据类型)也能够使得在运行时表现的更好。 实际上,因为我们认为这很重要所以在默认情况下我们会给出一个警告!(指未定义数据类型)
2、如果没有声明路径,它将默认为一个内在的,而不是公开的。
声明的默认路径将由私有的起而代之(公开),意味着那些定义可见在只包含那些定义的那些包,而不是所有的代码。 这与诸如Java的其它一些些语言是相同的。因为ActionScript2.0的声明默认为公开, 这可能成为一个明显的漏洞,因此我们建议你为你的声明建立一个路径以至于它是透明的(意思就是说某些企图是徒劳的).为了鼓励这种好习惯,当没有声明路径时,ActionScript3.0编译器将弹出一个警告!
3、类被默认为是密封的,意味着扩展的特性将不能够在运行当中加入。
类现在可以是动态的或者密封的。 动态的类能在运行当中增加另外的动态的特性;密封的类则不能。密封类保存在存储器当中因为不需要其它的杂乱信号,并且编译器能提供更好的错误反馈。 如声明class Foo,它是密封的。如果声明一个动态的类,请使用dynamic关键字, 例如dynamic class Foo。
4、如果需要引用一个包中的类,现在它是包含在包当中来引用。
包的关键字对ActionScript 3.0来说是一种新的方式。 ActionScript 2.0 代码为: class mx.controls.Button {... }。ActionScript 3.0 代码:package mx.controls {class Button {. .. }}
如同ActionScript 2.0,一个公开类的文件名与类的名字是相同的。若干个类可能放在同一个独立的文件夹中,但是只有一个类是公开的,并且它的名字必须与文件名相匹配
5、类必须导入,即使是那些提及到类
使用MyPackage.MyClass类,你必须导入MyPackage.*; 或者导入MyPackage.MyClass;这是必须的即使是那些提及到的类,列如使用全名MyPackage.MyClass。 在ActionScript 3.0中,被导入的文件表明你想使用来自于另一个包的类,而在ActionScript 2.0中它只是一个简写。 在ActionScript 3.0中,完整的类名称用于消除模棱两可的情况,而且不会是导入文件方式的替代方式。
6、覆盖方法必须标记为override
Override关键字使得避免了覆盖方法中的一个明显缺陷, 譬如为一个覆盖方法指定了错误名字或方法署名, 或者当这个覆盖方法的名字改变时。并且它可以通过查询代码清楚的看到一个方法已经被覆盖。因为它可以清楚的知道一个方法是否覆盖了另一个方法, 对于编译器编译能够得到有效的确认。Override关键字是受到了C#中的override关键字的启发。
7、外加的(属性)应该作为强制性数据项目,而不是对象的属性。
对象匮乏的安全类型将可能导致意想不到的错误,所以编译器也将给出一个警告。绑定某对象的属性,比如selectedItem.name, 将导致一次警告; 你需要使用强制性数据项目,比如,EmployeeInfo(selectedItem).name 。
8、函数必须定义返回值。
这样做是为了安全的数据类型, 所以你不能落下定义任一个返回值的数据类型或者为一个对象取得默认的类型。如果一个函数没有返回任何值,声明它返回一个空值。
9、代理方式将在建立,使得事件派遣变得更容易
在ActionScript 2.0, 寻址事件对方法要求使用mx.utils.Delegate类或者其它的
import mx.utils.Delegate;
myButton.addEventListener(“click”, Delegate.create(this, onClick));
在ActionScript 3.0, 提及到的方法将自动的记住它所涉及到的对象实例。 实质上,这是一种自动的代理。 所以,代码可能简单地被写成:
myButton.addEventListener(“click”, onClick);
10、间接引用空值或未定义值的忽略将不会被忽略。
间接引用空值或未定义值在以前的ActionScript 中会被忽略了和或者告知未定义。 现在, TypeError 的忽略将不会被忽略。 应该注意代码中存在空值或未定义值, 以及无声息中导致的失败。新的不忽略机制适应了ECMAScript 规格。
11、编译将于命令行的堆栈形式进行并且调试过程中将出现文件名以及行的进度
当一个运行错误发生, 对话框将描述出这个错误并且显示出哪里出的这个错误。 使用详细的说明以及调试工具的选择将能够使你更加简单的定位到出现错误的地方。
12、属性不再是默认的被绑定。(Properties are no longer bindable by default.)
如果属性需要绑定你必须用[Bindable]元数据标记。(You must declare them to be bindable by using the [Bindable] metadata tag.)
13、Flash Player API 被改组在一个包中
以前, Flasy PlayerAPI中的所有类和函数是全局的, 现在,它们被放在了包当中,比如flash.display,flash.events,flash.ui。 例如, MovieClip 放在了flash.display.MovieClip, trace(),getTimer() 和setInterval()被放进了flash.util包当中。
14、新的时间类为时间事件提供了一个比setInterval/setTimeout函数更加纯正的机制
新的时间类比setInterval体现出了更多的优点, 比如不需要一个时间间隔,并且更加先进, 面向对象的界面。我们认为用时间类替代setInterval/setTimeout是一个良好的习惯。
15、Event已经作为一种强制, 而且必须是一个新的事件类的子类。
这意味着你能不再使用类对象的一个普通事例来派遣一个事件, 并且你不可能使用对象简写制方式, 即 { type:”customEvent” } 。不是创建一个普通对象, 现在你需要使用Event class。
如果你想获得其它的属性你需要通过建立子类事件。 这样的做法是为了使得数据类型能够更安全和更有效。
16、视觉原理扩展了DisplayObject,你可以象定义其他类一样定义它们. 显示列表开始用addChild()来动态地增加组成部分。
结果, createChild() 已经不被提倡使用。虚拟的实体, 包括TextField, 能够象其他对象一样来展示并且用addChild() 或者addChildAt方便地加入到显示列表中 。注意这还涉及到其它一些APIs, 譬如createEmptyMovieClip() 和 createTextField()已经成为过去式。 为了创造新的TextField你可以用”new TextField()”来代替”create TextField()”。
17、E4X (ECMAScript 为XML) 被推荐在flash中用来处理XML。
ActionScript中的E4X变的更加强大和完整,提供给了计算机一种新的能力。以前的flash XML类依然可以用来使用。 如果你更喜欢以前的XML API, 改称为XMLDocument, 它被放在flash.xml包中。
18、当使用E4X时, toString方法已经不能用来标记整个对象返回全部的XML; 如果需要获得它,应该使用toXMLString method.
toString方法可以用于返回XML对象中某段字符。 它已经不能用于记录整个的XML对象。 如果需要获得标记的XML,使用toXMLString方法。
19、For…in 的循环语句已经不能够用来列举一个类中的属性和方法;它只能够用来列举一个对象中动态的属性。
ActionScript 3.0以一种新的和比较先进的机制描述内在的属性和方法, 叫做describeType 。在ActonScript 3.0中是用describeType描述内在的属性和方法。
20、你能够用你所定义的一个类的实例来作为一个SWF对象。
在ActionScript 2.0中, SWF对象总是MovieClip类 。在ActionScript3.0, 它可能会是Sprite类的子类。 你可以为DocumentRoot中的SWF文件定义一个类 。当SWF已经下载完成时,它将代替这个类作为最终对象。