龙图教育:AS3方法和技巧(10)

2020-05-07 09:10

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


龙图教育:AS3方法和技巧(10).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:深圳黑弧广告-员工手册

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: