var array:Array = new Array(); array[1] = 1; array[0] = 2; array[2] = 3;
for (var key:String in array){
trace(\}
Output AS 1&AS 2: array[2] = 3 array[0] = 2 array[1] = 1 Output AS 3: array[0] = 2 array[1] = 1 array[2] = 3
This provices a more intuitive order when iterating through arrays with for..in and for each..in. 注意:使用for each..in语句来循环操作自己定义的类的实例时,必须确定这个类是动态(dynamic)的.
51.函数参数的默认值
AS3允许你为自定义函数的参数指定默认值,被指定默认值的参数变成了可选择的,在函数调用时,如果没有明确指定参数值,默认参数值被赋值给函数的argument对象.
function method(required:String, optional:String = \trace(required +\}
method(\
你只能将使用默认值的参数放在其它参数的后面,也就是说你不能像下边这样定义函数:
// Incorrect:
function method(required:String = \
52 用?(rest) 来表示不确定个数的Arguments变量
因为as3中会在函数调用时检查参数(argument)的数量,所以我们不可以像在as1/as2时候那样随意的设置函数参数(argument)的个数.但as3使用一个新的特殊的参数来解决这个问题.这个参数是?(rest) (Keyword: ?(rest)).
参数?(rest) 放置在函数的参数列表的最后边,用来表示当函数调用时可以附加传递任意个数任何类型的参数,它的格式是三个点加上一个关键字. 当函数被调用时,这些附加的参数(arguments)被以数组形式绑定到这个关键字. ActionScript Code:
41
function usingRest(required:Number, ... optionalArgs):void {
trace(required);// 1
trace(optionalArgs); // [2, 3, 4] trace(optionalArgs.length);//3 }
usingRest(1, 2, 3, 4);
53 argument对象
同as1/as2一样,在as3中当一个函数调用执行的时候也会创建一个特殊的arguments对象(Top level arguments),但不同的是,as3的arguments对象没有caller属性(no arguments.caller) , To get a reference to the caller, you must pass a reference to that function as an argument. 要获得对caller的引用,需要事先传递函数的一个引用作为参数(argument). ActionScript Code:
function args(str:String, num:Number):void { trace(arguments)? }
args(\
不幸的是,当使用?(rest) 参数的时候arguments 对象数组不存在,也就是说arguments数组只有在不使用?(rest)的时候存在,在使用?(rest)而且需要一个callee引用的时候注意这个问题。
54 支持命名空间
AS3支持命名空间(namespaces).用法和XML中的命名空间类似,通过名称(命名空间)来区分不同”空间”,和package有点相似.类比一下,你可以在一个应用程序(application)中定义两个名称相同的类.(只需定义在两个不同的package块中),而命名空间充许你在一个类中定义两个同名的函数,(只需定义两个不同的命名空间).命名空间也可以有public, private, protected, and internal四种访问属性.
使用命名空间,你需要像声明类中其它成员一样先声明一个命名空间.命名空间使用关键字namespace Keyword 来声明.
package {
public class UsingNameSpaces { public namespace company; public namespace individual; company var value:int = 10; individual var value:int = 2;
public function UsingNameSpaces(){ }
company function showValue() {
42
}
individual function showValue() { } } }
这里用到company和individual两个命名空间,它们被用来定义变量value和函数showValue,因为两个同名的变量(函数)在不同的命名空间中,它们是可以的. 此外,命名空间还可以被定义成一个URI,如:
package {
public class UsingNameSpaces {
public namespace company = \ public namespace individual = \ company var value:int = 10; individual var value:int = 2;
public function UsingNameSpaces(){ }
company function showValue() { }
individual function showValue() { } } }
55.命名空间:Name Qualifier Operator (::)命名修饰符 当在命名空间中访问类的成员时,需要通过定义好的命名空间来引用这个类成员,这时可以使用命名修饰符);(name qualifier operator).
命名修饰符是用两个冒号来连接命名空间和试图访问的类成员(已经存在于命名空间中),如:namespace::member ,
package {
public class UsingNameSpaces {
public namespace company = \ public namespace individual = \ company var value:int = 10? individual var value:int = 2?
public function UsingNameSpaces(){ company::showValue()? // traces 10 individual::showValue()? // traces 2 }
company function showValue() { trace(company::value)?
43
}
individual function showValue() { trace(individual::value)? } } }
需要注意的是尽管showValue已经在命名空间内被调用了,但仍然需要在函数中完整的引用命名空间的其它成员. 56 动态不可继承
同as2中一样,as3充许使用dynamic关键字(dynamic keyword)来创建动态类.动态类可以动态的添加类的属性和方法,而不必在类定义中添加,例如Array类,创建一个Array实例,你可以在外部赋给它任意值,而不必在Array类中定义。
在AS2中,一个子类扩展一个动态类,那么这个子类也是动态的.
// superclass.as
dynamic class superclass { }
// subclass.as
class subclass extends superclass { }
// main movie
var instance:subclass = new subclass()?
trace(instance.anything)? // ok since subclass inherited dynamic
而在AS3中继承动态类的子类,如果不指明访问属性的话,不会再默认为动态的.
// superclass.as package {
dynamic class superclass { } }
// subclass.as package {
class subclass extends superclass { } }
// main movie
var instance:subclass = new subclass()?
trace(instance.anything)? // error, property not defined (not dynamic)
57.自定义MouseWithin事件
有时候我们希望一些动作仅当鼠标在某个MovieClip或者Sprite内时发生。在Director的Lingo
44
语言中有mouseWithin事件,可以很轻松的实现,但是在Flash中并没有这样的事件,不过用AS3的事件模型可以很容易的创建自己的mouseWithin事件。
mouseWithin事件本质上是一个enterFrame事件,不过它只有当鼠标在可视对象(display objects)内,或者鼠标接触到可视对象时候执行。这样,我们需要在鼠标进入对象时创建一个enterFrame事件,离开是删除(remove)这个enterFrame事件。当让在AS2/AS1中也可以实现,你可以使用onRollOver和enterFrame来实现,不过这样如果使用同一个MC的话,会相互干扰的。
在AS3中实现这个事件,意味着给你的类添加一些事件,然后来设置侦听器。
// methods managing mouseWithin
private function addMouseWithin(event:MouseEvent):void { addEventListener(Event.ENTER_FRAME, mouseWithin); }
private function removeMouseWithin(event:MouseEvent):void { removeEventListener(Event.ENTER_FRAME, mouseWithin); }
private function mouseWithin(event:Event):void {
dispatchEvent(new MouseEvent(\}
// in constructor
public function MySpriteClass() {
addEventListener(MouseEvent.MOUSE_OVER, addMouseWithin); addEventListener(MouseEvent.MOUSE_OUT, removeMouseWithin); }
添加侦听器:
addEventListener(\
58.final:控制覆写或继承
final关键字(Toplevel final keyword)作用类和类的方法成员的属性,用来控制它们是否被覆写和继承.
当一个函数被除标记为final时,这个类的子类就不能被覆写(override).
final public function methodName() { // your statements here }
同样的,当一个类被标记为final时,则它不可以被继承了.
package{
final public class ClassName {
45
// your statements here } }
注:没有必要在一个标记为final的类中再标记一个final的函数,因为本来类就不会被继承,所以这个类中的函数也没有可能被覆写的. 59.MXMLC:SWF Metadata标签
在使用MXMLC(Flex 2 SDK提供的一个命令行的编译器,可以用来单独编译MXML和ActionScript 3文件)来编译ActionScript 3的swf文件,或者用Flash Builder 2中创建的AS项目.你可以使用SWF metadata标签来设置影片的通用属性. SWF metadata标签支持四种属性:
* width
* height * frameRate
* backgroundColor
例如:
package {
[SWF(width=\ public class MyApp extends Sprite {
} }
上面的code编译时,会设置SWF影片大小为500*450,白色背景,帧频为24fps. 60.in操作符
in操作符(in operator)是as3新增加的,用来某个已经存在的值是否属于某个对象,它同hasOwnProperty相似,但in只用于可以继承的变量值.
trace(\ // true trace(\
46