ActionScript3.0学习之路(1)——ActionScript3.0初体验

最近换了一家公司,由于业务需要,要使用Flex,而ActionScript3.0是Flex的基础语言,于是开始学习。

 

谈一谈看到现在为止对ActionScript3.0的看法吧。

 

从语法角度来看,真像是一个大杂烩,集合了Java、C#、Javascript的各种语法。

 

private、internal、protected、public四级访问权限和Java一样,包也是采用类似Java目录结构的物理存储方式,至于说Java不是完全面向对象,存在基本数据类型,而ActionScript3.0中则自动关联了对应的包装类,使得基本数据类型也可以调用方法等等,这点比较好,但是存在所谓的“全局方法”似乎又打破了其完全面向对象的设计,挺不明白的。

 

ActionScript3.0的数值类型挺让我纠结的,Number类型很容易让人犯错误,既可以是整型也可以是浮点型,我不知道设计者这样设计是出于什么样的考虑,一般的编程语言里面,整数都默认为int型,而ActionScript3.0里面默认为Number,也就是说,1/3这样的表达式不再等于0,而等于0.3333333,而且出现了浮点数的加减法都出现误差的情况,和Javascript倒是挺相似,唉,都是脚本啊。

 

然后是强类型问题,真是半强不强的类型啊,为什么这么说呢?很多类的确是要声明类型,而且编译时要检查的,但是,ActionScript3.0又提供了动态类型,声明变量的时候可以用*或者Object等等,里面可以像Javascript一样运行时添加属性,而且可以用类型JSON语法初始化动态对象,这些又向Javascript学得有模有样,也许有关键字能够限制动态类型吧,不过动态类型这种东西的存在其实还是挺危险的。

 

再就是getter和setter了,看得出来ActionScript3.0这里向C#取了点经,不像Java一样是方法,采用了get和set关键字声明的方法可以像属性一样使用,但令人遗憾的是,它不像C#里面有默认标准——首字母大写(当然,程序员也可以完全不遵守),几乎看不出来getter和setter与普通属性的区别,而且编译器居然分辨不出同名的普通属性与getter和setter的区别,也就是说,属性名不能与getter和setter的方法名一模一样,属性还要另想名字,唉,一般属性前面加个下划线算了吧,真怀念Java的getter和setter就是个方法,多好。

 

然后是不支持方法重载,但支持可变长度参数列表,实现方法重载只能靠它了,和Javascript倒是挺像的,不过这里可变长度参数列表是要声明的,当然,传参多样化的同时复杂度真是不小,对文档的依赖又重了,别人写的类,不看代码也不知道该咋传参,似乎有些本末倒置,本来方法的初衷就是方便别人使用。至于方法重写,和C#挺像,用override关键字。

 

强制类型转换的语法很别扭,一般的语言是:(类名)变量名,ActionScript3.0是:类名(变量名),像调用方法一样,还有另外一种转换方式和C#很像,利用as关键字,转型不成功的就为null,这个我挺喜欢,不用写异常处理了。

 

当然,ActionScript3.0里面也有不少强大的东西,目前个人觉得最强大的莫过于数组,比Javascript里面的数组还要强大得多,简直相当于是Java里面List和Map的杂合,数组里面可以放不同类型的元素,貌似强类型的语言这么做挺危险,数组可以动态地增加长度,即向头部或尾部甚至是任意位置压入值、弹出值,甚至可以向一个远大于数组长度的索引位置设置值,前面的自动给你设为undefined(嗯,undefined,Javascript特色的东西),这哪是数组?简直比ArrayList和LinkedList加起来还强大。这还没完呢,具有Javascript特色的关联数组也可以存在,像Java里面的Map一样,基于键值对的数组,或者说基本上和Javascript里面的关联数组差不多,其实个人觉得,关联数组和动态类型差别也不是很大了。还没完呢,数组提供了很多排序、筛选等方法,可以自己写回调函数决定规则,算是运用策略模式的一个良好设计吧,虽然觉得还是有点缺陷。不过,这是我见到过的史上最强大数组,当然,同时带来的是使用的复杂性和不安全性。

 

ActionScript3.0里面的事件驱动是基于回调函数的,个人觉得虽然效果上和Java差不多,但是还是不如Java的设计,基于回调函数的方法毕竟还是自由化了一些,不像基于接口那么规范,而且也违背了面向对象的初衷,传的参毕竟是个函数指针而不是对象(后面证实个人的思维还是有局限性,其实ActionScript3.0里面函数也是对象),当然,作为脚本语言,也还算是不错了,至少比Javascript都用event强,这里好歹事件对象是分类别的,都是Event的子类。

 

还有一个挺看好的就是基于XML的E4X访问,感觉比XPath来得要强,主要是因为语言特性,动态类型的存在,使得E4X能得到良好的支持,对于XML,ActionScript3.0的支持还是相当强大的,似乎已经剥离了对象的束缚,虽然强大,但也让初学者不知所措,好坏还要看各人怎么看了。

 

目前的了解就到这么多,没有系统地去看完一本书什么的,大略的初看了一下而已,后面应该会花一段时间好好研究一下。

 

最后说一下,为什么我老是要强调ActionScript3.0呢,因为ActionScript3.0和ActionScript2.0区别很大,由于ActionScript2.0没有接触过,不敢说ActionScript3.0的东西在ActionScript2.0里面就一定是这么回事。

你可能感兴趣的:(Flash)