ActionScipt技巧和开发中会遇到的问题

英文原文:《Tips for learning ActionScript 3.0》
原文地址:http://www.adobe.com/devnet/actionscript/articles/actionscript_tips.html
译者:Dreamer。

学习ActionScipt的一些提示
ActionScript 3.0是一种强大的面向对象语言,它为Flash Player描绘了一种新的编程模型。如果你已经对ActionScript 1.0或2.0很熟悉,那么当你使用ActionScript 3.0开发你的第一个应用程序的时候需要知道一些语言差别。
注:更多资料,请参考Flex 2.0 Language Reference中ActionScript 2.0 和ActionScript 3.0之间的不同点的列表。
为了帮助大家更容易地过渡到ActionScript 3.0,我编辑了下面的列表,其中包括技巧和你可能在开发中会遇到的普遍的问题。

为所有变量,参数和返回值声明类型。为所有变量,参数和返回值声明类型不是必须的,但是它被认为是最好的习惯。它将会帮助编译器给你更多地有用的错误信息。它还会增强运行时的性能,因为虚拟机将会认为你事先知道你所做的工作。实际上,它是如此重要所以如果你没有声明我们会给出一个警告。
注意现在没有访问方式的声明都默认是internal方式,而不是public。现在默认的访问方式是internal而不是public,这就是说这个声明只对含有这个声明的包可见,而不是对所有代码都可见。这一点和其它一些语言相一致,比如JAVA。因为ActionScript2.0的声明默认为是public,这个变化将很可能造成普遍的错误,所以请总是在声明前面加*问方式,让你的意图更加清楚。为了鼓励这个好习惯,ActionScript 3.0编译器将在没有访问方式声明的时候给出一个警告。
注意类都是默认为封装(sealed)的,也就是说不能在运行时动态地添加属性。现在类可以是动态的(dynamic)或者封装的(sealed)。动态(dynamic)类可以在运行时添加动态属性;封装(sealed)类不行。因为不需要内部哈希表来保存动态的属性,封装(sealed)类占用内存少,而且编译器可以对它提供更好的错误反馈。Class Foo这种声明就是封装(sealed)的。要声明一个动态(dynamic)类,就使用dynamic关键字——比如,dynamic class Foo。
使用包(package)声明把一个类放到一个包(package)里面。Package是ActionScript 3.0中一个新的关键字。
ActionScript 2.0 代码:

class mx.controls.Button { … }
ActionScript 3.0 代码:

package mx.controls { class Button { .. } }
在ActionScript 2.0中,一个public类必须放在一个文件名和类名相同的文件中。多个类可能在同一个文件中声明,但是只有一个类可能是public,并且这个类的名字必须和文件名字相同。
导入类,即使对这个类的引用都是完全合法的。要使用MyPackage.MyClass类,你必须导入它:
import MyPackage.MyClass;
你必须这样做既是所有的引用都是完全合法的,并且要使用完整的名字MyPackage.MyClass。在ActionScript 3.0中,import语句表明你想要使用一个来自另外一个包中的类,而在ActionScript 2.0中,它只是用来帮助记忆类名。在ActionScript 3.0中,完整的类名只是用来消除歧义,而不再是import语句的替代品。
也可以使用 * 通配符来导入一个包中的所有类。

import MyPackage.*;
单个地导入类被认为是一个好习惯,因为这样更明确地表明了你的代码使用了哪一个类。
始终标记方法的覆写。Override关键字可以帮助避免覆写方法时常见的错误,比如对一个被覆写得方法定义了错误的名字或者被覆写的方法的名字改变导致的错误。这样做会使包含有覆写方法的代码看起来更清晰。因为编译器能够知道一个方法是否试图覆写另外一个,它就能执行更好的检查。ActionScript 3.0中的override关键字是从C#的override关键字中获得的灵感。
在函数中定义返回类型。为一个函数定义返回类型是一个好习惯。如果你忽略了返回类型,会出现一个警告。这是为了类型的安全性,这样一来你就不会无意中没有写返回类型而得到默认的Object返回类型。如果一个函数没有返回任何值,将它的返回类型声明为void。
注意,delegate现在被定义到了语言里,使得事件分派更简单。在ActionScript 2.0中,把事件指向到一个方法需要使用mx.utils.Delegate 类或者其他的工作:
import mx.utils.Delegate;
myButton.addEventListener(”click”, Delegate.create(this, onClick));
在ActionScript 3.0中,方法的一个引用会自动记住它引用的对象实例。这被称为method closure。本质上来说,这就是一个自动的delegate。所以,代码可以简单地写成:
myButton.addEventListener(”click”, onClick);
现在解除一个null或者undefined的引用将会抛出一个异常。解除一个null或者undefine的引用在以前的ActionScript中会被忽略并且定义引用为undefined。现在,一个TypeError异常会抛出。提防无意中解除的null或undefined引用,并且依靠这个报告错误的特性。这种新的抛出异常的特性与ECMAScript定义相符合。
使用-verbose-stacktraces和 -debug选项。使用命令行选项-verbose-stacktraces和-debug编译可以使文件名和行号出现在Flash Player的警告框中。当一个运行时错误发生时,一个对话框会描述这个错误并且列出它发生错误的地方的调用堆栈。使用-verbose-stacktraces和-debug选项可以让在源代码中定位错误变得简单。
显式声明bindable属性。属性不再默认为bindable。你必须使用[Bindable]元数据标签来声明它们为bindable。
注意Flash Player API被重新组织到了包里。以前Flash Player API中所有的类和函数都是全局的。现在有了许多包,象flash.display, flash.events, flash.ui以及其它。举个例子,MovieClip现在是flash.display.MovieClip并且getTimer 和 setInterval都被放进了flash.utils 包中。
使用新的Timer类,而不是setInterval/setTimeout。与setInterval/setTimeout函数相比,新的Timer类为timer事件提供了更清晰的机制。新的Timer类与setInterval方法相比有很多优势,比如不需要处理ID数字间隔,还有一个更好的,面向对象的接口。我们把使用Timer而不是使用setInterval和setTimeout看作是一个好习惯。
确认事件(event)是继承而来的。现在事件(event)是强类型的,并且必须是新的Event基类的子类。新的Event类让事件体系更加清晰和有效。但是,这也意味着当分派事件的时候你不能再使用Object类的通用实例了,并且你不能使用对象的文字简写——例如,{type: ‘customEvent’ }。
你现在需要使用Event类(例如,dispatchEvent(new Event (’myCustomEventType’))),而不是创建一个通用的Object类。如果你想要传递附加的属性就需要从Event继承。不使用Object的动机是为了获得更高的类型安全性和效率。
注意可视的元素必须继承自DisplayObject,并且你可以像其它类一样定义它们。组件现在通过new动态创建并且使用addChild被添加到显示列表中。所以,不鼓励使用createChild。可视化的实体,包括TextField,可以像其它对象一样实例化并且使用addChild或addChildAt简单地添加到显示列表中。注意,这意味着一些API消失了,比如createEmptyMovieClip 和 createTextField。你可以使用new TextField而不是使用createTextField来创建一个新的TextField。
现在在Flash中推荐使用 E4X (ECMAScript for XML)来操作XML。E4X与以前的Flash XML类相比非常强大并且更好地整合进了语言中,它还提供了很多新的性能。以前的Flash XML类依然可以使用。如果你喜欢用以前的XML API,它就在flash.xml包中。它依然可用只是重新命名成了XMLDocument。
当使用E4X的时候使用toXMLString方法。toString方法没有为对象返回完整的XML标记;如果你想获得,使用toXMLString方法。toString方法为XML对象返回一个简单的字符串。它并不会完全将XML对象序列化。要获得XML标记,请调用toXMLString方法。
For……in循环将不再枚举类中声明的属性或者方法。它只枚举一个对象的动态属性。ActionScript 3.0特性中有一个针对对象自省的新的先进机制,叫做describeType。在ActionScript 3.0中使用它来自省对象。
现在一个SWF文件的根对象可以是你自主选择的一个自定义类的实例。ActionScript 2.0中,一个SWF文件的根对象总是MovieClip的实例。而在ActionScript 3.0中,它可以使Sprite的任意子类。你可以设定一个类作为一个SWF文件的DocumentRoot。当其加载时,SWF文件会将它实例化然后将其作为自己的根对象。
特别感谢我们的开发团体为这篇文章提出建议。这里列出的决不是详尽的,但是它是一个起点,可以帮助你打好学习ActionScript 3.0的基础。如果你熟悉其它的面向对象的语言,你可能发现这些提示只是一个复习——复习你已经在别处学习到的并且可以立即在ActionScript 3.0中使用的技巧。
如果你对ActionScript 3.0和面向对象编程是一个新手,那么这些提示将会派得上用场。对你来说,这就是一个简单的可以帮你巩固知识的列表。编码愉快!

ActionScipt技巧和开发中会遇到的问题

上一篇:Photoshop设计制作漂亮的燃烧的立体火焰字


下一篇:Photoshop将室内人物图片调制出唯美的日系暖色调