SimpleButton类中包括四个决定按钮状态的属性:upState,overState,downState和hitAreaState.创建显示对象来表示这些属性,这样,用AS3就能创建一个全功能的按钮元件.
myButton.upState = mySprite1; myButton.overState = mySprite2; myButton.downState = mySprite3; myButton.hitAreaState = mySprite4;
15.数组定义中的逗号
AS3使用括号操作符来快速定义数组,可以像PHP中那样在最后一个元素后面保留一个逗号,这样在多行数组定义中能少错误的操作.
var myList:Array = [ \\\\];
在AS1和AS2中,元素”fox”后面的逗号会引起错误的出现,但在AS3中不会了. 注意:上述操作只对[]有效,对于Array()或者new Array()是无效的.
var myList:Array = new Array( \\\\);
//error
16.包块
AS3中的包(package)和AS2中在定义方式有一点不同,在AS3中,包(package)的路径不再作为类定义的一部分,而成了关键字package来定义的一部分. 程序块定义基本结构(AS3):
package my.package.path { class MyClass { } }
程序块定义基本结构(AS2):
11
// ActionScript 2:
class my.package.path.MyClass { }
实际上,AS3中所有的类文件都需要定义成为一个package块,尽管可能这些类并不一定在同一个包中.
package {
class NotInAPackageClass { } }
一个package块中可以定义类,也可以只是定义函数.但package块中的类或者函数名必须与文件名(除去.as扩展名)相同.如一个package块定义一个函数中:
package com.kirupa.utils {
function StripString(str:String):void { // ... } }
这个文件必须命名为StripString.as,放在com/kirupa/utils文件夹中. 17.同文件中的助手类(Helper Class)
无论是AS2还是AS3,类都被定义在.as文件中.AS3有了进步,可以用额外的助手类(helper classes)来扩展主类(primary class),这些助手类和主类定义在相同的.as文件中.助手类(helper classes)在主类定义之后定义,它只对同一文件中package块中定义的主类(或者函数)或者其它助手类可见.
package {
class MyClass {
function MyClass() {
var helper:MyHelper = new MyHelper(); } } }
class MyHelper {
function MyHelper() {
var helper:HelpersHelper = new HelpersHelper(); } }
class HelpersHelper {
function HelpersHelper () { }
12
}
注意,每一个package块中只能定义一个类,外部助手类不作为package块的一部分,而且它只能被封装在package块内的类使用. 18.访问属性
AS3引入了两个新的访问类成员的方式,而且完善了AS2中的private访问方式,在AS3中有四种控制访问的方式:
public protected private
internal (default)
public:和AS2中一样,public成员可以被任何对象访问.类构造函数一般定义为public类型,应用类(Application classes)需要定义为public类型.
pretected:新增的访问控制类型,protected成员对子类访问继承父类变量有效,从其它类以任何方式访问protected变量都会出现错误.
类和类的构造函数都不能定义为protected方式.
private:AS2中的private属性的工作很像protected,充许子类完全访问private成员,AS3中private成员只能在类内访问,对于其它类,甚至是子类,也不能访问类中的private成员,这样,在子类中定义一个与private对象同名的新成员,也不会引起冲突,因为private对象在超类(superclass)中完全隐藏了.
类和类的构造函数都不能定义为private方式.
internal:和public相似,但在访问程序包(package)有限制,在同一程序包中(package)类可以任意访问其它类中的internal成员.但在其它package中的类不能访问别的package中类的internal成员.
类和类成员默认访问类型是internal,但构造函数默认为public
在helper classes中的访问控制有一点点不同,因为helper Classes原则上不属于package,它们的internal访问只限于同一文件内的类,它们在定义时默认为internal访问.(注意:主类不能用helper class扩展,只能在同一个文件中用一个helper class扩展另一个helper class.)
一些注意:无论是在编译时,还是在runtime中,AS3中访问控制都是有效的.用AS2去访问隐藏方法的黑客程序(Hacks)对于AS3不再有效. 作者写的几个例子:
package {
import flash.display.Sprite;
// Application class needs to be public (internal by default) public class AccessControl extends Sprite {
// constructors are always public function AccessControl() {
13
// only classes in this file // can access helper classes
var helper:Helper = new Helper();
trace(helper.pubNum); // OK
// trace(helper.protNum); // Error - cannot access protected // trace(helper.privNum); // Error - cannot access private trace(helper.interNum); // OK } } }
// Helper class is implicitly internal class Helper {
// public access granted anywhere // variables are usually protected or
// private with get/set used for public access public var pubNum:Number = 1;
// protected access granted only for // subclasses in that class
protected var protNum:Number = 2;
// private access granted only in this class private var privNum:Number = 3;
// internal access granted only in the same // package, but for helper classes, it means // only in the same file
internal var interNum:Number = 4;
// constructors are always public function Helper() { } }
// SubHelper class is implicitly internal // can extend other helper classes class SubHelper extends Helper {
// constructors are always public function SubHelper() {
14
trace(pubNum); // OK
trace(protNum); // OK - inherited
// trace(privNum); // Error - cannot access private trace(interNum); // OK } } 2.
package {
import flash.display.Sprite; import containers.*;
// Application class needs to be public (internal by default) public class AccessControl extends Sprite {
// constructors are always public function AccessControl() {
// can access classes in other packages // only if public
var bowl:Bowl = new Bowl(); // OK
// var basket:Basket = new Basket(); // Error - cannot access internal
trace(bowl.pubNum); // OK
// trace(bowl.protNum); // Error - cannot access protected // trace(bowl.privNum); // Error - cannot access private // trace(bowl.interNum); // Error - cannot access internal } } } 3.
package containers {
// public class accessible anywhere public class Bowl {
// public access granted anywhere public var pubNum:Number = 1;
// protected access granted only for // subclasses in that class
15