ActionScript深入加强

来源:互联网 发布:广电网络官网 编辑:程序博客网 时间:2024/05/08 04:33

ActionScript 3.0是一种功能强大的编程语言,负责Flex应用的业务逻辑的实现和对应用程序进行控制。用户通过使用MXML和ActionScript共同完成Flex应用的开发。
本章主要介绍ActionScript 3.0以及如何在Flex 2中使用ActionScript 3.0。本章侧重于基本语法的讲述,具体的编程接口感兴趣的读者可以参看相关的API说明。

ActionScript 3.0简介

ActionScript是Flash Player运行环境的编程语言,主要应用于Flash动画和Flex应用的开发。ActionScript实现了应用程序的交互、数据处理和程序控制等诸多功能。ActionScript的执行是通过Flash Player中的ActionScript虚拟机(ActionScript Virtual Machine)实现的。ActionScript代码通常被编译为ABC字节码,执行时与其他资源以及库文件一同编译为SWF文件,在Flash Player中运行。
随着Flash和Flex的发展,ActionScript也不断地发生变化。从ActionScript 1.0、ActionScript 2.0到现在的ActionScript 3.0,ActionScript逐渐成为功能强大、符合规范的编程语言。对于Flash和Flex开发者来说,ActionScript 3.0无疑注入了一针强心剂。

ActionScript 3.0语法基础

      我们学习一门外语的时候,首要学习它的语法。而学习一门编程语言,也是如此。语法是每一种编程语言最基础的东西,例如如何设定变量、使用表达式、进行基本的运算。本章以及本章后面的章节都将介绍ActionScript 3.0的基本语法,即ActionScript 3.0最基础的部分。
  

语法、语句和表达式

语法可以理解为规则,即正确构成编程语句的方式。必须使用正确的语法来构成语句,才能使代码正确地编译和运行。这里,语法是指编程所用的语言的语法和拼写。编译器无法识别错误的语法。
语句负责执行特定的动作。例如赋值、比较。下面的例子中if语句是一个条件语句,它可以通过对表达式的判断确定下一个动作。
// if 语句
if (condition) {
  // 语句;
}


分号和冒号

分号常用来作为语句的结束和循环中参数的隔离。ActionScript 3.0的语句以分号(;)字符结束,如下面两行代码中所示。
var myNum:Number = 50;
myLabel.height = myNum;
注意:使用分号终止语句能够在单个行中放置不止一条语句,但是这样做往往会使代码难以阅读。
分号还可以用在for循环中,作用是分割for循环的参数,如以下代码所示。
var i:Number;
for (i = 0; i < 10; i++) {
    trace(i); // 0,1,...,9
}


括号

括号通常用来对代码进行划分。ActionScript 3.0中的括号包含两种:大括号“{}”和小括号“()”。无论大括号还是小括号都需要成对出现。


大括号

使用大括号可以对ActionScript 3.0中的事件、类定义和函数组合成块。在包、类、方法中,均以大括号作为开始和结束的标记。控制语句(例如if..else或for)中,利用大括号区分不同条件的代码块。下面的例子是使用大括号为if语句区别代码块,避免发生歧义。
var num:Number;
if (num == 0) {
  trace("输出为0");
}


小括号

小括号的用途很多,例如保存参数、改变运算的顺序等。下面的例子显示了小括号的几种用法。
myFunction("Carl", 78, true);            //保存参数
var x:int = (3+4)*7;                     //改变运算顺序

文本

文本是直接出现在代码中的值。例如true、false、0、1、52,甚至字符串“abcdefg”。 下面列出的都是文本。
17
"hello"
-3
9.4
null
undefined
true
false
文本还可以组合起来构成复合文本。下面的例子中显示了使用文本对数组进行初始化。
var myStrings:Array = new Array("alpha", "beta", "gamma");
var myNums:Array = new Array(1, 2, 3, 5, 8);

 注释

注释是一种对代码进行注解的方法,编译器不会把注释识别成代码。注释可以使ActionScript程序更容易理解。
注释的标记为/*和//。使用用/*创建多行注释,//只能创建单行注释和尾随注释。
1.单行注释
单行注释用于为代码中的单个行添加注释。
2.多行注释
对于长度为几行的注释,可以使用多行注释(又称"块注释")。
3.尾随注释
尾随注释用于在代码所在的行内添加注释。 


关键字与保留字

       在ActionScript 3.0中,不能使用关键字和保留字作为标识符,即不能使用这些关键字和保留字作为变量名、方法名、类名等。
“保留字”只能由ActionScript 3.0使用,不能在代码中将它们用作标识符。保留字包括“关键字”。如果将关键字用作标识符,则编译器会报告一个错误。表列出了ActionScript 3.0关键字。

 
常量

常量是指具有无法改变的固定值的属性。ActionScript 3.0新加入const关键字用来创建常量。在创建常量的同时,需为常量进行赋值。常量创建的格式如下所示。
const 常量名:数据类型 = 常量值
下面的的例子定义常量后,在方法中使用常量:
public const i:Number=3.1415986;    //定义常量
public function myWay()
{    
trace(i);                  //输出常量
}
}


变量

在前面的内容中重点介绍了ActionScript 3.0的一些特点和编程的基础,在以下的章节中将从语法的角度深入介绍ActionScript 3.0,使读者熟悉ActionScript 3.0的语法规则。


变量在程序中的作用

变量主要用来保存数据。变量在程序中起着十分重要的作用,如:存储数据、传递数据、比较数据、简练代码、提高模块化程度和增加可移植性等。
1.存储数据
2.比较数据
3.传递数据
4.简化代码
5.提高模块化程度和增加可移植性
  

变量的声明和赋值

在使用变量时,首先要声明变量。声明变量时,可以为变量赋值,也可等到使用变量时再为变量赋值。
1.声明变量
2.为变量赋值
3.变量命名规则
4.变量默认值


运算符

运算符是一种特殊的函数,它们具有一个或多个操作数并返回相应的值。本节介绍常见类型的运算符、运算符优先级和运算符结合律的一般规则。


运算符与操作数

运算是对数据的加工。利用运算符可以进行一些基本的运算。被运算的对象称为操作数,即被运算符用作输入的值。运算符通常是文本、变量或表达式。下面的例子中,将加法运算符“+”和乘法运算符“*”与三个操作数2、3和4结合进行运算。赋值运算符“=”随后使用该值将运算所得的值14赋给变量sum。
var sum:uint = 2 + 3 * 4;
运算符包含一元、二元和三元。一元运算符只有一个操作数,例如递增运算符“++”。 二元运算符有两个操作数,例如除法运算符“/”。三元运算符有三个操作数,例如条件运算符“?:”。


 运算符的优先级和结合律

运算符的优先级和结合律决定了运算符的处理顺序。虽然编译器先处理乘法运算符“*” 然后再处理加法运算符“+”似乎是自然而然的事情,但实际上编译器要求显式指定先处理哪些运算符。此类指令统称为“运算符优先级”。
ActionScript 3.0定义了一个默认的运算符优先级,可以使用小括号运算符“( )”。下面的例子中使用小括号改变默认优先级,强制编译器先处理加法运算符,然后再处理乘法运算符。
var sum:uint = (2 + 3) * 4;
trace(sum)//输出20.不是14


主要运算符

主要运算符包括那些用来创建Array和Object、对表达式进行分组、调用函数、实例化类实例以及访问属性的运算符。表列出了所有主要运算符,它们具有相同的优先级。


一元运算符

一元运算符只有一个操作数。递增运算符(++)和递减运算符(--)是“前缀运算符”,它们在表达式中出现在操作数的前面。前缀运算符与它们对应的后缀运算符不同,因为递增或递减操作是在返回整个表达式的值之前完成的。下面的例子说明如何在递增值之后返回表达式++i的值。
var i:Number = 0;
trace(++i);
//输出1
trace(i);
      //输出1

 
算术运算符

算术运算符包含:加“+”、减“-”、乘“*”、除“/”、模运算“%”和求反运算“-”。下面的例子显示了加、减、乘、除的用法。
var i:int = 7;
var j:int = 9;
var sum:int = i+j;
trace(sum)
//输出16
var sub:int = j-i;
trace(sub)
//输出2
var mul:int = i*j;
trace(mul)
//输出63
var div:int = i/j;
trace(div)
//输出0


关系运算符

关系运算符用来对操作数进行比较,常用于关系表达式中作为判断的条件。关系运算符是二元运算符,有两个操作数,对两个操作数进行比较。比较的结果为布尔型(Boolean),即true或者false。表列出了所有关系运算符,它们具有相同的优先级。


等于运算符

等于运算符为二元运算符,用来判断两个操作数是否相等。等于运算符也常用于条件和循环运算。原理与条件运算符类似。表3.11列出了所有等于运算符,它们具有相同的优先级:


逻辑运算符

逻辑运算符即与或运算符。它是二元运算符,对两个操作数进行与操作或者或操作,返回布尔型结果。逻辑运算也常用于条件运算和循环运算,一般情况下,逻辑运算符的两边为表达式。
逻辑运算符具有不同的优先级。表按优先级递减的顺序列出了逻辑运算符。


as和typeof

as运算符常用来检查数据类型是否符合要求。如果符合要求返回被判断的对象,格式与is运算符一致。
当变量的数据类型符合指定数据类型时,返回true,否则,返回false。下面的例子显示如何使用as运算符。
var i:int = 7;
if (i as Number)  //当变量i为Number型时,输出“ok”
{
     trace("ok");
}
else
{
     trace("no");
}


 三元运算符

三元运算符即条件运算符“?:”,包含三个操作数。条件运算符是if..else 条件语句的一种简化的表达方式。该运算符的格式如下所示。
表达式1?表达式2:表达式3
该运算的操作过程是:若表达式1为true,则执行表达式2;否则执行表达式3。下面的例子显示如何使用条件运算符。
var a:String ="silence";
var i:int;
(a!="")?(i=1):(i=0);         //当a不为空时执行i=1,否则执行i=0
trace(i);
//输出1

  
赋值运算符

赋值运算符有两个操作数,它根据一个操作数的值对另一个操作数进行赋值。表列出了赋值运算符,它们具有相同的优先级.


数据类型

数据是程序的必要组成部分,也是程序处理的对象。数据类型描述一个数据片段,以及可以对其执行的各种操作。数据存储在变量中。在创建变量、对象实例和函数定义时,通过使用数据类型来指定要使用的数据的类型。数据类型是对程序所处理的数据的抽象。本节介绍ActionScript 3.0中的数据类型。


  数据类型概述

ActionScript 3.0中包含两类数据类型:基元数据类型(Primitive data type)和复杂数据类型(Complex data type)。
基元数据类型即编程时基本数据类型。包括Boolean、int、Null、Number、String、uint和void。复杂数据类型包含:Object、Array、Date、Error、Function、RegExp、XML和XMLList。自定义类属于复杂数据类型。
基元数据类型的处理速度通常比复杂复杂数据类型的处理速度快。ActionScript 3.0按照一种尽可能优化内存和提高速度的特殊方式来存储基元值。


常用数据类型

在对数据类型分类后,下面对实际编程中常用的数据类型进行简要的介绍。常用的数据类型包含:Boolean、int、uint、Number、String、Object、Array,void、Null。
1.Boolean
2.int、uint、Number
3.String
4.Object 数据类型
5.Array数据类型
6.void数据类型
7.Null数据类型


  类型检查

类型检查即对变量值进行检查,是否符合变量的数据类型声明。类型检查可以在编译时或运行时执行。静态类型语言(如C++和Java)在编译时执行类型检查。动态类型语言(如 Smalltalk和Python)在运行时执行类型检查。ActionScript 3.0是动态类型的语言,它在运行时执行类型检查,同时也支持在名为“严格模式(Strict Mode)”的特殊编译器模式下,在编译时执行类型检查。在严格模式下,类型检查既发生在编译时也发生在运行时,但是在标准模式(Standard Mode)下,类型检查仅发生在运行时。
在构造代码时,动态类型的语言带来了极大的灵活性,但代价是在运行时可能出现类型错误。静态类型的语言在编译时报告类型错误,但代价是要求类型信息在编译时是已知的。


数据类型转换

在将某个值转换为其他数据类型的值时,发生了类型转换。类型转换可以是“隐式的”,也可以是“显式的”。
隐式转换又称为强制转换。例如,如果将值2赋给Boolean数据类型的变量,则Flash Player会先将2转换为布尔值true,然后再将其赋给Boolean变量。
显式转换在代码中指示编译器,将一个数据类型的变量视为属于另一个数据类型。在涉及基元类型时,转换功能将一个数据类型的值实际转换为另一个数据类型的值。要将对象转换为另一类型,请用小括号将对象名括起来,并在它前面加上新类型的名称。例如,下面的代码将一个布尔值转换为一个整数。
var myBoolean:Boolean = true;
var myINT:int = int(myBoolean);
trace(myINT); 输出1


 控制程序的流程

控制程序的流程即使用控制结构实现对代码执行顺序的控制。本节介绍ActionScript 3.0中的流程控制以及流程控制语句的使用。


 流程控制概述

ActionScript 3.0是面向对象和事件驱动的,但面向对象与面向过程并不是对立的。面向对象和面向过程代表两种不同的解决思路。类实现了面向对象,而在类实现的具体程序是面向过程的。换句话说,在每一个代码块的内部,ActionScript 3.0会遵循程序的流程,执行它所遇到的每一行代码。
在面向过程中,程序的执行顺序除“顺序”执行外还包括“条件”和“循环”。流程的控制也主要体现在“条件”和“循环”。
利用条件可以控制程序中的哪些部分要执行而哪些部分要被跳过。条件模拟了我们日常中的选择行为。


条件语句

ActionScript 3.0中提供了三种可用来控制程序流程的条件语句:if..else、if..else if和switch。
1.if…else
if..else条件语句用于条件判断。如条件表达式为true,则执行if的语句,表达式为否,则执行else内的语句。if…else的结构如下所示。
2.if..else if
if..else if语句是在if…else的基础上建立的。其实质是在if…else后又添加了if。可以使用if..else if条件语句来测试多个条件。
3.Switch
如果多个执行路径依赖于同一个条件表达式,可以使用switch语句。它的功能大致相当于一连串的if..else if语句,但是switch语句更便于阅读。


循环语句

使用循环语句可以反复执行一个特定的代码块,但该循环不是无限的。循环语句根据循环的条件判断何时开始循环,何时结束循环。
ActionScript 3.0中提供了五种结构的循环语句:for、for..in、for each…in、while和do..while。其中for each…in为ActionScript 3.0新添加的循环语句。
1.for
2.for..in
3.for each..in
4.while
5.do..while
6.break和continue


 函数

函数在任何编程语言中都是非常重要的部分,在ActionScript 3.0中也不例外。与其他编程语言相比,ActionScript 3.0中的函数有其自身的特点。本节将对ActionScript 3.0中函数进行简要的介绍。


  函数的基本概念

“函数”是执行特定任务并可以在程序中重用的代码块。ActionScript 3.0中包含两类函数:“方法”(Method)和“函数闭包”(Function closures)。如果将函数定义为类定义的一部分或者将其与对象绑定,则该函数称为方法。如果以其他任何方式定义函数,则该函数称为函数闭包。
1.定义函数
2.函数的调用与返回


  函数的参数

ActionScript 3.0为函数参数提供了一些功能,这些功能对于那些刚接触ActionScript 3.0语言的程序员来说可能是很陌生的。如何选择参数的使用方式,会影响代码的设计方式。
1.按值或按引用传递参数
2.默认参数值
3....(rest)关键字


 函数与对象

在ActionScript 3.0中,可以把一切都看作对象,函数也不例外。当创建函数时,其实质就是创建了一个对象。与其他对象不同的是,函数对象类型为Function类型,该对象不仅作为参数进行传递,还可以有附加的属性和方法。
当函数作为参数传递时,是按引用传递的。在将某个函数作为参数传递时,只使用函数名即可。例如,下面的代码将名为clickListener()的函数作为参数传递给addEventListener()方法。
addEventListener(MouseEvent.CLICK, clickListener);


面向对象编程

ActionScrip 3.0是一种面向对象的编程语言。面向对象的编程使用对象或数据结构,将控制对象行为或外观的属性和方法组合在一起。使用对象可以组织并重复使用代码。定义了一个对象后,可以通过名称引用该对象,而无需在每次使用它时重新进行定义。面向对象含义深远,涉及很多重要概念,只有充分理解这些概念的含义,才算真正理解了什么叫面向对象。限于篇幅,本节只介绍ActionScript 3.0中涉及的最重要的一些概念。


 类和对象

类(Class)是对象(Object)的软件抽象,是创建对象的模板。类定义一系列具有公共特性,并且能够以相同方式进行控制的对象。类是ActionScript 3.0的编程单元。例如,可以将人被看作一个类,公司中的员工看作一个对象,则类定义描述人的特征和功能,能反映所有人具有的公共属性和行为。而对象由类派生后,可以具有特殊的属性和行为,对于公司员工来说,是从事具体某一行业的人。
1.类
2.构造函数
3.类的分类
4.属性和方法
5.类成员的访问控制
6.对象
7.类与对象的区别


封装

封装(Encapsulation)也称为隐藏实现(Hiding the implemention)。封装的主要作用是隐藏具体的实现细节,也可称作“黑箱操作”。在封装中,只对外提供接口,不提供具体的操作细节,所以用户看不到内部的细节。
举个简单的例子,我们看电视的时候,只需打开电视机电源,然后切换自己要看的频道即可,不需要了解电视机是如何工作的。电视机将这些具体的实现细节都屏蔽掉了,用户只要拿着遥控器操作就行了。
在具体的代码构建过程中,封装解决了如何为系统建模的问题。在面向对象的世界中,要把系统建模成类,类也要建模为属性和方法。设计类将如何完成这些事情的过程被称为封装。


  包

包(Package)是封装中一个非常重要的概念。在实际的编程中,利用包可以方便的组织自己的代码,并将自己的代码与别人的代码分开进行管理。同时包还可以避免命名冲突。在ActionScript 3.0中,包是用命名空间实现的,但包和命名空间并不相同。下面介绍如何创建包和导入包。
1.创建包
2.导入包


 继承

继承描述了一种“IS-A(是一个)”的关系,用来表示类与类之间的关系。例如,红富士是一种苹果,而苹果是一种水果。继承是面向对象编程的一个重要特征。它模拟了从一般到特殊的过程。也可以将继承看作一种层次化的结构。
如果类B继承了类A,则类B会从类A继承属性和方法,并添加其自己的专用属性和方法。类A称为类B的父类(Parent)、超类(Super-Class)或者基类(Base)。类B则成为子类(Child)或者派生类(Drived-Class)。类B继承类A也可以称为类A派生出B类。类A的子类以及子类的子类都称为类A的后代。设计类的时候可以将通用的方法中放入父类中,将具有特殊用途的方法放在子类中。


抽象

抽象是个分析的过程,是在事物周围绘制一个清晰的框架。抽象应该包括应用程序最通用的功能、属性和方法。抽象的过程,就是定义类知道和要完成的事情的过程。
抽象类有一个重要特点,抽象类不能生成实例,必须用作派生其他类的父类。抽象类的主要作用是抽取若干类的共同行为,形成更为清晰的概念层次。但是在ActionScript 3.0中,不能像其他面向对象语言那样使用abstract关键字,而且ActionScript 3.0也不支持抽象类的实现。但是在ActionScript 3.0中,一些内置类实际上就是抽象类,


 接口

接口(Interface)主要用来描述类具有什么功能,而并没有定义功能是如何实现的。一个类可以实现一个或者多个接口。实现同一接口的类具有相同的特征。使用这些类的时候,只需遵从统一的接口即可,无需关心内部是如何实现的。
1.定义接口
2.在类中实现接口


命名空间

命名空间往往出现在XML中。但在ActionScript中实现的语法和细节与XML的稍有不同。在ActionScript 3.0中,命名空间(Namespace)的目标是控制类成员对外部的可见性。命名空间的作用与访问控制的说明符public、private等类似。也可以将命名空间看作为,解决不同类对象同名的问题,避免引用时发生冲突。例如在两个类中都有update方法,但那是每个update方法含义都不相同,这时使用命名空间就可以解决方法的重名问题。下面讲述如何使用命名空间。
1.定义命名空间
2.应用命名空间
3.引用命名空间

核心类
ActionScript 3.0最本质的东西就是类,也就说它是面向对象的。ActionScript 3. 0在面向对象基础上重新构建了ActionScript 3.0核心类。
核心类是ActionScript 3.0的根基。核心类也被称之为内置类,是一些内置于ActionScript 3.0中的的类。利用核心类,可以完成复杂的数学运算、处理XML和完成程序运行时异常和错误的捕捉与处理。
      ActionScript 3.0核心类位于ActionScript 3.0的顶级包中,具体包括如表所示。


数组

数组是一种基本的数据结构,它供了一种组织、存储、处理多个相关数据的方式,通过有序列表存储、获得数据或信息。数组也是最常用的数据类型之一,例如存储下拉列表的选项、存储用户的输入信息。ActionScript 3.0提供了丰富的接口操纵数组,更为方便的使用数组。
我们常说的数组通常指通过使用有序列表存储数据的方式。将每个数据存储在列表的元素中,通过下标(索引)访问数据。但在ActionScript 3.0中,不仅定义了存取数据的数组,同时定义了其他类型的数组,分别为索引数组(Index Array)和关联数组(Associative Array)。
1.索引数组2.关联数组3.数组的长度
4.创建数组5.访问数组6.查找
7.添加元素8.删除元素9.排序


字符串

在“数据类型”一节中介绍了字符串的基础知识。在ActionScript 3.0中没有其他编程语言的CHAR类型,只有String类型,即所有与字符相关的都通过String类型进行处理。String类型属于基元数据类型,所以String字符创建,永久不会改变。本节介绍在ActionScript 3.0常用的字符串操作。
1.创建字符串2.length属性
3.比较字符串4.连接字符串
5.求子串6.查找子串
7.分割字符串


正则表达式

正则表达式(Regular Expression)是由普通字符(例如字符a到z),以及称为元字符组成的文字模式。用于查找和处理字符串中的匹配文本的模式。它不仅功能强大,而且使用非常广泛。通常用于验证文本值是否符合特定模式。例如,验证用户输入的电话号码,或者替换与特定模式匹配的部分文本值。正则表达式的字符看起来十分复杂,往往让人感觉一头雾水。但掌握了规律,你会发现正则表达式非常简单,而且易用。
1.正则表达式语法
2.正则表达式文字符号
3.创建正则表达式
       4.正则表达式方法


异常处理

异常是指程序运行过程中出现的错误和意外。例如数组越界、读取文件不存在。异常处理是指在应用程序中用来构建响应异常以及及时对异常所采取的措施。
一个良好的应用程序,应该对程序运行过程中可能发生的任何情况予以考虑,避免因为程序异常而造成意外。所以建立良好的异常处理机制有利于应用程序更加健壮,更加易于维护。
1.错误类型
2.ActionScript 3.0中的异常处理
3.try..catch..finally
4.自定义错误处理
3.10  在Flex中使用ActionScript 3.0
Flex的核心是MXML和ActionScript。MXML是用于为Flex应用程序进行用户界面组件布局。MXML属于表示层,最终要编辑成ActionScript并生成ActionScript类文件在FlashPlayer上运行。


基本使用方式

Flex最核心的还是ActionScript。在Flex中,ActionScript是类库的方式出现的,该类库包含组件(容器和控件)、管理器类、数据服务类和所有其他功能的类。本节主要介绍在Flex中使用ActionScript的方法。主要有如下3种基本方式。
1.内联方式
2.级联方式
3.外联方式


 常用的元数据标签

元数据标签是一种特殊的标签,它在代码中的作用就是向编译器提供如何编译程序的信息。实际上,这些标签并没有被编译到生成的SWF文件中,而只是告诉编译器如何生成SWF文件。
在Flex 2中,同样支持元数据标签的使用,且在很多情况下,元数据标签都起到非常重要的作用,例如:数据绑定时[Bindable]、使用图标时的[Embeded]等。
本节讲述如何在Flex 2中使用一些常用的元数据标签。
1.[Bindable]    2.[Embed]
3.[DefaultProperty]    4. [Event]
5.[Effect]    6.[ArrayElementType]
原创粉丝点击