1、 addEventListener() 方法有两个参数:
■ 第一个参数是您希望响应的特定事件的名称。同样,每个事件都与一个特定类关联,而
该类将为每个事件预定义一个特殊值;类似于事件自己的唯一名称(应将其用于第一个
参数)。
■ 第二个参数是事件响应函数的名称。请注意,如果将函数名称作为参数进行传递,则在
写入函数名称时不使用括号。
如:创建一个侦听器函数,在单击名为 myButton 的对象时将调用该函数。
function eventResponse(event:MouseEvent):void
{
// 此处是为响应事件而执行的动作。
}
myButton.addEventListener(MouseEvent.CLICK, eventResponse);
2、 数据类型
■ Number:任何数值,包括有小数部分或没有小数部分的值
■ Int:一个整数(不带小数部分的整数)
■ Uint:一个“无符号”整数,即不能为负数的整数
■ 文本 XML值(直接输入 XML):
var employee:XML = <employee>
<firstName>Harold</firstName>
<lastName>Webster</lastName>
</employee>;
3、ActionScript 3.0 引入了无类型变量这一概念,这一类变量可通过以下两种方法来
指定:
var someObj:*;
var someObj;
无类型变量与 Object 类型的变量不同。二者的主要区别在于无类型变量可以保存特殊值
undefined,而 Object 类型的变量则不能保存该值。
ActionScript 3.0 则不同,它既不支持嵌套类也不支持私有类。
3、
(1)如果用于局部变量的变量名已经被声明为全局变量,那么,当局部变量在作用域内时,局部定义会隐藏(或遮蔽)全局定义。全局变量在该函数外部仍然存在。
(2)如果您在某个代码块中声明一个变量,那么,该变量不仅在该代码块中可用,而且还在该代码块所属函数的其它任何部分都可用。
(3)如果缺乏块级作用域,那么,只要在函数结束之前对变量进行声明,就可以在声
明变量之前读写它。这是由于存在一种名为“提升”的方法,该方法表示编译器会将所有的
变量声明移到函数的顶部。但是,编译器将不会提升任何赋值语句。如:
trace(num); // NaN
var num:Number = 10;
trace(num); // 10
(4)ActionScript 3.0是动态类型的语言,它在运行时执行类型检查,同时也支持在名为“严格模式”的特殊编译
器模式下在编译时执行类型检查。在严格模式下,类型检查既发生在编译时也发生在运行
时,但是在标准模式下,类型检查仅发生在运行时。
4、 is 运算符
它可用来测试变量或表达式是否为给定数据类型的成员。is 运算符检查正确的继承层次结构,不但可以用来检查对象是否为特定类的实例,而且还可以检查对象是否是用来实现特定接口的类的实例。例如:
var mySprite:Sprite = new Sprite();
trace(mySprite is Sprite); // true
trace(mySprite is DisplayObject); // true
trace(mySprite is IEventDispatcher); // true
5、 as 运算符
as 运算符是 ActionScript 3.0 中的新增运算符,也可用来检查表达式是否为给定数据类型的成员。但是,与 is 运算符不同的是,as 运算符不返回布尔值,而是返回表达式的值(代替 true)或 null (代替 false)。例如:
var mySprite:Sprite = new Sprite();
trace(mySprite as Sprite); // [object Sprite]
trace(mySprite as DisplayObject); // [object Sprite]
trace(mySprite as IEventDispatcher); // [object Sprite]
trace(mySprite as Number); // null
在使用 as 运算符时,右侧的操作数必须是数据类型。如果尝试使用表达式 (而非数据类型)作为右侧的操作数,将会产生错误。
6、 动态类
“动态”类是定义在运行时可通过添加/ 更改属性和方法来改变的对象。非动态类(如 String类)是“密封”类。您不能在运行时向密封类中添加属性或方法。在声明类时,可以通过使用 dynamic 属性来创建动态类。如:
dynamic class Protean{}
下面的代码创建 Protean 类的一个实例,并向该实例中添加两个名称分别为 aString
和 aNumber 的属性与一个方法:
var myProtean:Protean = new Protean();
myProtean.aString = "testing";
myProtean.aNumber = 3;
myProtean.traceProtean = function ()
{
trace(this.aString, this.aNumber);
};
myProtean.traceProtean(); // 测试 3
7、 数据类型说明
基元数据类型包括 Boolean、int、Null、Number、String、uint 和 void。
ActionScript核心类还定义下列复杂数据类型:Object、Array、Date、Error、Function、RegExp、XML 和 XMLList。
Number 数据类型可以表示整数、无符号整数和浮点数。默认值为 NaN
uint 数据类型在内部存储为 32 位无符号整数,它包含一组介于 0 和 4,294,967,295 (232-1)之间的整数(包括 0 和 4,294,967,295)。
void 数据类型仅包含一个值:undefined。
类型转换:
要将对象转换为另一类型,请用小括号括起对象名并在它前面加上新类型的名称。
var quantityField:String = "3";
var quantity:int = int(quantityField); // 显式转换成功。
如果 Flash Player 由于某种原因而无法转换某种数据类型的变量,则会将该变量赋予它的默认值。
对于包含非数字字符的字符串值,在用 int() 或 uint() 转换时,将返回 0 ;在用 Number()
转换时,将返回 NaN。转换过程中会忽略前导和尾随空白,但是,如果字符串中包含将两个
数字隔开的空白,则将返回 0 或 NaN。
在将字符串值转换为 Boolean 数据类型时,如果字符串为 null 或空字符串 (""),则会返回
false。否则,将返回 true。
将其它数据类型转换为 String 数据类型时的结果:
Array 一个包含所有数组元素的字符串。
Boolean "true" 或 "false"。
Date Date 对象的字符串表示形式。
null "null"
Number、int 或 uint 数字的字符串表示形式。
Object 如果实例为 null,则结果为 "null" ;否则为 "[object Object]"。
声明对象:
(1) 数组
// 使用 new 语句。
var myStrings:Array = new Array(["alpha", "beta", "gamma"]);
// 直接赋予字面值。
var myStrings:Array = ["alpha", "beta", "gamma"];
(2) 初始化通用对象。通用对象是 Object 类的一个实例。对象字面值括在大括
号 ({}) 中,各对象属性之间用逗号隔开。每个属性都用冒号字符 (:) 进行声明,冒号用于分
隔属性名和属性值。
// 使用 new 语句。
var myObject:Object = new Object({propA:1, propB:2, propC:3});
var myObject:Object = {propA:1, propB:2, propC:3};
(3) 常量
只能为常量赋值一次,而且必须在最接近常量声明的位置赋值。例如,如果将常量声明为类的成员,则只能在声明过程中或者在类构造函数中为常量赋值。
8、 运算符的优先级和结合律
除了赋值运算符之外,所有二进制运算符都是“左结合”的,也就是说,先处理左边的运算符,然后再处理右边的运算符。赋值运算符和条件运算符 (?:) 都是“右结合”的,也就是说,先处理右边的运算符,然后再处理左边的运算符。
9、 一元运算符
它们具有相同的优先级
++ 递增(前缀)
-- 递减(前缀)
+ 一元 +
- 一元 - (非)
! 逻辑“非”
~ 按位“非”
delete 删除属性
typeof 返回类型信息
void 返回 undefined 值
delete 运算符仅适用于对象的属性,不能删除方法
10、 主要运算符
主要运算符包括那些用来创建 Array 和 Object 字面值、对表达式进行分组、调用函数、实例化类实例以及访问属性的运算符。
运算符 执行的运算
[] 初始化数组
{x:y} 初始化对象
() 对表达式进行分组
f(x) 调用函数
new 调用构造函数
x.y x[y] 访问属性
<></> 初始化 XMLList 对象 (E4X)
@ 访问属性 (E4X)
:: 限定名称 (E4X)
.. 访问子级 XML 元素 (E4X)
1) 按位移位运算符
运算符 执行的运算
<< 按位向左移位
>> 按位向右移位
>>> 按位无符号向右移位
2) 关系运算符有两个操作数,它比较两个操作数的值,然后返回一个布尔值。
运算符 执行的运算
< 小于
> 大于
<= 小于或等于
>= 大于或等于
as 检查数据类型
in 检查对象属性
instanceof 检查原型链
is 检查数据类型
3)等于运算符
运算符 执行的运算
== 等于
!= 不等于
=== 严格等于
!== 严格不等于
11、 for each..in 循环
for each..in 循环用于循环访问集合中的项目,它可以是 XML 或 XMLList 对象中的标签、对象属性保存的值或数组元素。与 for..in 循环不同的是,for each..in循环中的迭代变量包含属性所保存的值,而不包含属性的名称:
var myObj:Object = {x:20, y:30};
for each (var num in myObj)
{
trace(num);
}
// 输出:
// 20
// 30
12、 自定义函数
在 ActionScript 3.0 中可通过两种方法来定义函数:使用函数语句和使用函数表达式。
1)
函数语句是在严格模式下定义函数的首选方法。函数语句以 function 关键字开头。如:
function traceParameter(aParam:String)
{
trace(aParam);
}
traceParameter("hello"); // hello
2)声明函数的第二种方法就是结合使用赋值语句和函数表达式,函数表达式有时也称为函数字
面值或匿名函数。例如:
var traceParameter:Function = function (aParam:String)
{
trace(aParam);
};
traceParameter("hello"); // hello
原则上,除非在特殊情况下要求使用表达式,否则应使用函数语句。函数语句较为简洁,而
且与函数表达式相比,更有助于保持严格模式和标准模式的一致性。
函数语句与函数表达式之间的区别:
1)第一个区别体现在内存管理和垃圾回收方面,因为函数表达式不像对象那样独立存在。
换言之,当您将某个函数表达式分配给另一个对象(如数组元素或对象属性)时,就会在代
码中创建对该函数表达式的唯一引用。如果该函数表达式所附加到的数组或对象脱离作用域
或由于其它原因不再可用,您将无法再访问该函数表达式。如果删除该数组或对象,该函数
表达式所使用的内存将符合垃圾回收条件,这意味着内存符合回收条件并且可重新用于其它
用途。
2)第二个区别是,函数语句存在于定义它们的整个作用域(包括出现在该函数语句前面的语句)内。与之相反,函数表达式只是为后续的语句定义的。
13、 arguments 对象:
在将参数传递给某个函数时,可以使用 arguments 对象来访问有关传递给该函数的参数的
信息。arguments 对象的一些重要方面包括:
■ arguments 对象是一个数组,其中包括传递给函数的所有参数。
■ arguments.length 属性报告传递给函数的参数数量。
■ arguments.callee 属性提供对函数本身的引用,该引用可用于递归调用函数表达式。
例如:
function traceArgArray(x:int):void
{
for (var i:uint = 0; i < arguments.length; i++)
{
trace(arguments[i]);
}
}
traceArgArray(1, 2, 3);
// 输出:
// 1
// 2
// 3
14、 get 和 set 存取器方法也称为 getter 和 setter,可以使用这些函数为创建的类提供易于使用的编程接口,并遵循信息隐藏和封装的编程原则。
使用 getter 和 setter 函数还可以覆盖从超类继承来的属性,这是使用常规类成员变量时不能做到的
ActionScript 3.0可以使用类或静态常量创建枚举。枚举类是使用 final 属性声明的,因为不需要扩展该类。ActionScript 3.0 并不支持具体的枚举工具,这与 C++ 使用 enum 关键字或 Java 使用 Enumeration 接口不一样。
如:public final class PrintJobOrientation
{
public static const LANDSCAPE:String = "landscape";
public static const PORTRAIT:String = "portrait";
}
15、 定义接口
ActionScript 3.0中接口不能包含变量或常量,但是可以包含 getter 和 setter。要定义接口,使用 interface 关键字。
只能使用 public 和internal 访问控制说明符来修饰接口定义。 接口定义中的方法声明不能包含任何访问控制说明符。
在实现接口的类中,实现的方法必须:
■ 使用 public 访问控制标识符。
■ 使用与接口方法相同的名称。
■ 拥有相同数量的参数,每一个参数的数据类型都要与接口方法参数的数据类型相匹配。
■ 使用相同的返回类型。
16、 覆盖方法
覆盖方法表示重新定义已继承方法的行为。静态方法不能继承,也不能覆盖。不能覆盖超类中定义的变量,但是可以覆盖 getter 和 setter。
17、 不继承静态属性
静态属性不由子类继承。这意味着不能通过子类的实例访问静态属性。只能通过定义静态属性的类对象来访问静态属性。
虽然并不继承静态属性,但是静态属性在定义它们的类或该类的任何子类的作用域链中。同
样,可以认为静态属性在定义它们的类和任何子类的“作用域”中。这意味着在定义静态属
性的类体及该类的任何子类中可直接访问静态属性。例如:
class Base {
public static var test:String = "static";
}
class Extender extends Base
{
public function Extender()
{
trace(test); // 输出:静态
}
}
允许使用与静态属性相同的名称定义实例属性。可以在与静态属性相同的类中或在子类中
定义这样的实例属性。例:
class Base
{
public static var test:String = "static";
public var test:String = "instance";
}
如果使用与同类或超类中的静态属性相同的名称定义实例属性,则实例属性在作用域链中的
优先级比较高。
18、 管理日历日期和时间
UTC 是一种标准时间定义(1970年 1 月 1 日午夜),它实质上与格林尼治标准时间 (GMT)相同。
getTimezoneOffset() 方法,该方法返回的值表示 Date 对象的时区与 UTC 之间相差的分钟数。
Timer类:
在 ActionScript 3.0 中处理计时函数的首选方式是使用 Timer 类 (flash.utils.Timer),可以使用它在每次达到间隔时调度事件。例如,下列代码创建一个每秒调度一个事件且持续 60 秒的 Timer 实例:
var oneMinuteTimer:Timer = new Timer(1000, 60);
如果将 Timer 实例设置为固定的间隔数,则在达到最后一次间隔时,它还会调度timerComplete 事件
19、 数组
ActionScript 3.0 不支持“指定类型的数组”概念,也就是说,不能指定数组的所有元素都属于特定数据类型。
创建数组:
第一种,如果调用不带参数的构造函数,会得到空数组。var names:Array = new Array();
第二种,如果将一个数字用作 Array 构造函数的唯一参数,则会创建长度等于此数值的数
组,并且每个元素的值都设置为 undefined。
var names:Array = new Array(3);
trace(names.length); // 输出:3
第三种,如果调用构造函数并传递一个元素列表作为参数,将创建具有与每个参数对应的元
素的数组。
var names:Array = new Array("John", "Jane", "David");
也可以创建具有数组文本或对象文本的数组。可以将数组文本直接分配给数组变量。
var names:Array = ["John", "Jane", "David"];
插入数组元素:
可以使用 Array 类的三种方法(push()、unshift() 和 splice())将元素插入数组。push()
方法用于在数组末尾添加一个或多个元素。unshift() 方法用于在数组开头插入一个或多个元素,并且始
终在索引号 0 处插入。splice() 方法用于在数组中的指定索引处插入任意数目的项目,传递给 splice() 的第一个参数是整数 1,它用于指示从索引 1 处开始插入。传递给 splice() 的第二个参数是整数 0,它表示不应删除任何项。传递给 splice() 的第三和第四个参数 Venus 和 Earth 为要插入的项。使用如下:
var planets:Array = new Array();
planets.push("Mars"); // 数组内容:Mars
planets.unshift("Mercury"); // 数组内容:Mercury,Mars
planets.splice(1, 0, "Venus", "Earth");
trace(planets); // 数组内容:Mercury,Venus,Earth,Mars
删除数组元素:
可以使用 Array 类的三种方法(pop()、shift() 和 splice())从数组中删除元素。pop()
方法用于从数组末尾删除一个元素。shift()方法用于从数组开头删除一个元素。splice()
方法既可用来插入元素,也可以删除任意数目的元素,其操作的起始位置位于由发送到此方
法的第一个参数指定的索引号处。使用如下:
var oceans:Array = ["Victoria", "Pacific", "Aral", "Superior", "Indian","Huron"];
oceans.splice(2, 2, "Arctic", "Atlantic"); // 替换 Aral 和 Superior
oceans.pop(); // 删除 Huron
oceans.shift(); // 删除 Victoria
trace(oceans); // 输出:Pacific,Arctic,Atlantic,Indian
在数组元素上使用 delete 运算符。delete 运算符用于将数组元素的值设置为 undefined,但它不会从数组中删除元素。delete oceans[2];
可以使用数组的 length 属性截断数组。如果将数组的 length 属性设置为小于数组当前长度的值,则会截断数组,例如:
var oceans:Array = ["Arctic", "Pacific", "Victoria", "Aral", "Superior"];
oceans.length = 2;
trace(oceans); // 输出:Arctic,Pacific
数组排序:
可以使用三种方法(reverse()、sort() 和 sortOn())通过排序或反向排序来更改数组的顺序。reverse() 方法用于按照以下方式更改数组的顺序:最后一个元素变为第一个元素,倒数第二个元素变为第二个元素,依此类推。sort() 方法可用来按照多种预定义的方式对数组进行排序,甚至可用来创建自定义排序算法。
sortOn() 方法可用来对对象的索引数组进行排序,这些对象具有一个或多个可用作排序键的公共属性。