Flash Actionscript知识:从AS2到AS3
随着Flash CS3正式版的发布,估计很多朋友都开始从AS2迁移到AS3了。不过AS3比AS2改变的实在太多,在as2中很多方法属性在as3中并不相同,甚至消失,而且目前帮助文档是E文的,现下的as3基础文章也并不多,因此特别引出这个讨论,集合一些基础性的要点,尽量以例子来说明,让大家更快更好的往AS3迁移。文中如有错误,敬请指正。有兴趣的朋友也可以一起来讨论。
1、常量
先看AS2代码:
var str:String; var num:Number; var boo:Boolean; var obj:Object; var notyped; trace(str+newline+num+newline+boo+newline+obj+newline+notyped); //return undefined undefined undefined undefined undefined |
再看AS3代码:
var str:String; |
从上面2个例子可以清楚的看到:在as2中String、Number、Boolean、Object 的默认值都是undefined,而在as3中则分别为null、NaN、false、null。只有未作申明的变量的默认值才是undefined。因此,在as2中一个"undefined"打天下的时代已经过时了,在as3中更加明确。同时as2中还有一个常量newline 在as3中已经取消,由"\n"替换。另外特别说明就是trace 方法的功能也加强了,参数个数不限,因此上面可以改成trace(str,num,boo,obj,notyped)了。
2、操作符
这里只讨论instanceof。虽然as3中还保留了这个操作符,但as3中推荐用is代替它。而且is的用法更为灵活。
代码:
var mystr:String="test"; var mytest:Test = new Test();//Test is extends SuperTest trace(mytest instanceof SuperTest); //AS2 return false //AS3 return true trace(mystr instanceof String);//AS2 return false trace(mystr instanceof String);//AS3 return true trace(mystr is String);//AS3 return true |
从此例可以看出instanceof 在as3中的比as2中有了变化。在as2中instanceof 不会将原始类型转换为包装对象,因此在上面例子中的 String 验证中返回false,并且它对超类(如SuperTest)不起作用。而在as3中它只检查原型链,所以在第一个trace 中会返回 true。但是as3中instanceof 并不支持接口,而is 支持。
代码:
var mytest:Test = new Test();//Test implements Inte易做图ceTest trace(mytest is Inte易做图ceTest); //AS3 return true trace(mytest instanceof Inte易做图ceTest); //AS3 return false |
至于add、eq、gt、ge、<>、and、not、or、ne、lt、le等AS1的语法在as3中统统取消了。
3、参数
在AS3中增加了一个... (rest)这样的参数。它的作用是指明函数可以接收任意多个以逗号分隔的参数。AS3代码:
function testfun1(param0, param1, ...arg) |
在AS2中我们已经知道有public, private 这2个访问控制符,在AS3中增加了internal和protected,并且对类、方法的访问控制更加严格,也更加合理和方便。另外,AS3中还增加了命名空间namespace,这样我们的访问控制更是灵活无比。(public和private 相信大家已经熟悉了,故不赘述)如有错误,敬请指正。
internal 指明类、变量、常数、方法等在包package 级别可访问到。大家可能会问它和public与private的区别。public只能在package{}中才能使用,但public控制的类或方法可以在任何地方访问到;private只能在class{}中才能使用,它控制的类或方法仅能在相应的class中才能访问到。而internal可以在package{}外使用,但它只能作用于这个as文件内部。比如如下DDD.as中代码为:
package flashrek.example{ public class DDD { function DDD() { var e:EEE=new EEE(); } } } internal var internalStr:String="internalStr"; class EEE { function EEE() { trace(internalStr); } } |
那么如下代码运行结果为:
import flashrek.example.DDD; var d=new DDD();//输出:internalStr trace(internalStr);//输出:错误Err |
可以看出,类DDD可以访问到package外的类EEE(默认就是internal,因此可以省略),而类EEE也可以访问到变量internalStr。而DDD.as文件外的其他地方就无法访问到EEE和internalStr了。
和internal不同,protected只能应用于类class内。它指明变量、常数、方法等在类class级别可访问到。与private区别在于,protected指定的方法、变量等是可以继承的,在子类中能访问到他们。
AS3中还引入了命名空间namespace。当你有一些有特殊用途的方法分布在不同的包package里,你想要这些方法在所有package里都可以应用,但你又不想把这些方法设置为public。这个时候,namespace就能达到你的目的。
首先你要定义一个namespace,(flashrek.as):
package flashrek.example{ public namespace flashrek= www.webjx.com; } |
然后在AAA.as文件中的代码为:
package flashrek.example{ import flashrek.example.flashrek; public class AAA { function AAA() { var b:BBB=new BBB(); //flashrek::NStest(); } flashrek function NStest() { trace("namespace test"); } } } //package外的类、命名空间不能默认且只能是internal的,且仅能为在此package内使用。 //package外是不能使用public关键字的。 internal class BBB { function BBB() { trace("BBB"); var c:CCC=new CCC(); } } class CCC { function CCC() { &n
访问www.zzzyk.com 试试 CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络, |