ActionScript 3 日积月累之一

本文是我(aw)在整理了相关文档和讨论之后,结合自己的亲自实验总结出来的一些经验和心得。我尽量描述详尽,避免模糊概念,当然也希望所有看官提出批评意见。为了表述方便,其中术语不限定语言,如我可能会一会儿用class,一会儿用“类”。

面向对象的难点部分就是理解变量作用域修饰符(modifier)其实也就是面向对象中我们已经熟悉的public、protected、private等等。本文还深入讨论了ActionScript3中新增的internal等概念。下面我依次列出:

一、关于package以及internal
package,用“形而上学”的方式理解,就是物理目录下的类集合。在AS2中只需要保证文件系统的路径匹配,然后用类似“import com.awflasher.someUtils”的方法导入即可。而AS3则要求您在所有的类中声明package关键词。package的大括号对 “{}”内,我们只能定义一个类,我们可以在这个大括号外面定义一些辅助类,不过这些类只能被当前这个类(你在package大括号对内定义的类)访问。当然,一个package大括号对内只有一个类,这并不代表一个package内只有一个类。你可以在同一目录下定义多个属于该package(指代这个目录)的类。它的意义绝不是简单的“类文件集合容器”,而是一个让各种应该协同工作的类集中到一起的项目包。值得一提的是,所谓“协同工作”是指至少有一个class要引入其他一些class 来进行功能设计,而这时候采用internal修饰可以省去很多getters和setters。我自己回忆起在湖南卫视的项目中用AS2开发的 Vplayer,两个类AVCore和AVControl就有很多getter和setter,搞的特别麻烦。

internal类似public,但限定在一个 package内了。在同一个package内的类可以访问同一个package内其他类的internal变量,而其他包内的类无法访问。 package 与类的继承性毫无关系,比如TextField和Sprite、MovieClip都继承自DisplayObject类,但TextField属于 flash.text包,而MovieClip和Sprite属于flahs.display包。也就是说,包对类的限定是与继承链毫无关联的、一个新的 “维度”的限定。
附:使用一个类的时候,我们必须import这个类,或者包含这个类的package。AS2时直接写完整包路径的使用方法在AS3中不管用了,本文后面有详细介绍。

二、关于public
public定义的类或者属性可以在任何作用域内由任何来源访问。构造函数永远都是public的,Flex中的应用程序类(Application Class)和Flash CS3中的文档类(Document Class)必须是public的。且不能缺省public这个关键词声明。我在测试中发现,如果不声明public,Flash根本就不会获取类的定义,进而编译无法通过。

三、关于protected
protected声明类似AS2的private,它定义的属性只能在自己子类中可见,而其它场合都是不可见的。这一点与Java等传统OOP语言类似。

四、关于private
注意AS3的private和AS2的private大不相同,它定义的属性只属于自己,子类可以定义毫无牵连的同名属性。
dynamic 和原来AS2的dynamic一样,用dynamic声明的类可以动态的加入属性。这些属性也可以通过delete来删除。动态加入的属性一旦被切断所有的引用就会被垃圾回收机制自动回收。有时候用System.totalMemory检测不到内存释放是因为垃圾回收机制并不是即时运行的。

五、关于dynamic
动态(dynamic)类允许在运行时动态地添加属性,常见的动态类有MovieClip和顶级(top-level)的Array。如果您的自定义类要继承于动态类,那么请也定义为动态的,不要省略dynamic关键词。

六、关于继承(extends)和override
继承其实并不太复杂,唯一要说明的就是:子类的构造函数一定要用“super”调用一次父类的构造函数,否则报错!对于继承后的子类,如果要重新定义父类的非private方法,必须使用override关键词。在override的时候,如果我们需要调用父类的方法,可以使用super关键词(由于继承方法在逻辑上与父类往往有相似性,因此没有必要把方法逻辑完全重写)官方帮助中的这个例子非常易懂:
package {
import flash.display.MovieClip;
public class SuperExample extends MovieClip
{
public function SuperExample()
{
var myExt:Extender = new Extender()
trace(myExt.thanks()); // output: Mahalo nui loa
}
}
}

class Base {
public function thanks():String
{
return “Mahalo”;
}
}

class Extender extends Base
{
override public function thanks():String
{
return super.thanks() + ” nui loa”;
}
}

override不能用于重载变量(成员属性)。但是却可以用于重写getter和setter函数,例如:(官方帮助的例子)
package
{
import flash.display.MovieClip;
public class OverrideExample extends MovieClip
{
public function OverrideExample()
{
trace(currentLabel)
}
override public function get currentLabel():String
{
var str:String = “Override: “;
str += super.currentLabel;
return str;
}
}
}

这个例子中,我们直接重写了MovieClip类的currentLabel属性。注意调用父类属性的时候,用了super.currentLabel。

关于静态方法,比较麻烦。首先,静态方法是无法被重载的。必须通过类来访问。但是您也可以自己定义与静态方法同名的方法,我把官方的例子做了一下修改就一目了然了:

package
{
import flash.display.MovieClip;
public class StaticExample extends MovieClip
{
public function StaticExample()
{
var myExt:Extender = new Extender();
}
}
}

class Base {
public static var test:String = “static”;
}

class Extender extends Base
{
private var test:String = “instance”;
public function Extender()
{
trace(Base.test); // output: static
trace(test); //added by awflasher.com, output: instance
}
}

七、关于import语法
在AS2时代,“import”语法只是为了让编程时代码简洁(省去了包名),比如我们import了mx.transitions.Tween之后,就可以直接new Tween()了。而如果不import,我们也可以直接用全类名来构造实例,例如:new mx.transitions.Tween();

然而,在AS3中,无论是否采用全名类声明,只要你用到这个类,就必须import。import估计是传统Flash程序员所需要养成的一个最大的习惯,在刚切入AS3开发平台的时候,我常常忘记import一些常用的类,例如从IDE 指向过来的文本和渲染元件,以及flash.event.*、flash.display.StageAlign等比较泛用的类。

AS3中不像AS2那样,我们不能用_root和Stage[”displayState”]来进行hacks了。

八、关于编译时的注意事项
AS3不再像AS2那样简单地Complie-Time(编译时,即FlashCS3/FlexBuidler/其他编译器发布ActionScript 及所有资源为SWF文件的那一时刻)进行类型检测了,AS3在Run-Time(运行时,级Flashplayer或者其他播放SWF的软件在播放SWF 的时候)也有类型检测,因此AS2的Hacks(强制访问不能访问的属性)将不再有效。

九、一个不得不说的好消息
AS3中类所有的变量(属性)和函数(方法)的作用域都是运行时跟类/实例走的。这与AS2大有不同,我们不再需要去Delegate了。只要是类自己的方法,在调用的过程中,this永远指向类自己(实例)。

简要总结:
1、如果我需要属性公开,并且可以被自己的子类继承,那么定义成public的。子类也可重写(override)之。
2、如果我需要属性隐藏,但是可以被自己的子类继承,那么定义成protected的。与public类似,子类也可重写(override)之。
3、如果我的某一个类有一个属性不想在任何位置可见,包括其子类,那么定义为private的。其子类无需重写(override),因为它根本就不存在于子类中。

时间: 2024-11-09 00:17:13

ActionScript 3 日积月累之一的相关文章

Flash常用ActionScript控制语句基本用法

控制|语句 很多朋友经常询问关于Flash的ActionScript脚本语句的用法,有些很简单的命令就能实现某种功能,现在我就把一些Flash的常用Action语句的基本用法讲解一下. 1.Goto:跳到一个指定的帧(Frame) Scene: 指定 Scene Frame:Number,Label,Expression,Next Frame,Previous Frame 可以选择 Frame 的编号,标号,通过表达式,下一帧,前一帧 Expression: 定义表达式 Control:Go t

浅释Flash ActionScript代码优化原则

优化 本文浅谈Flash ActionScript代码优化,主要针对Flash 8帮助里面提到的一些代码编写优化原则加以解释. 1.避免从一个循环中多次调用一个函数. 在循环中包含小函数的内容,可使效果更佳.小函数生命期短,利于资源释放.尤其是在大的循环中时. 2.尽可能使用本机函数. 本机函数要比用户定义的函数运行速度更快.本机函数即Flash中内有的一些函数(intrinsic),比如hitTest(),你没必要自己写一个类似的. 3.不要过多使用 Object 类型. 数据类型注释应力求精

Flash 8 ActionScript Filter Class滤镜入门

滤镜 作者:网易学院教授Allan Flash 8 最显著的变化是吸收了Director中的位图操作功能,非常棒的功能,让Flash动画也能支持位图的实时运算,再也不用借助于各种Mask去模拟位图特效了.Flash8本身的ActionScript也内置了几款常用的Filter Class滤镜类,包括有Blur (模糊),Bevel(浮雕),DropShadow(阴影),GlowFilter(发光)等,通过简单的AS语法也能快速操作位图达到我们想要的实时特效,今天首先尝试的时候Blur Filte

【as3】ActionScript 3.0体验试教学视频教程

很不错的视频教程 原文地址:http://blog.sina.com.cn/s/blog_3ecb9b1101009nx0.html 全屏观看地址: 视频1地址 视频2地址   教案发布: ActionScript 3.0 体验试教学--Making Things Move 第一部分 AS动画基础第一章 基础动画概念第二章 ActionScript 3.0 动画基础第三章 三角学应用第四章 渲染技术 第二部分 基础运动第五章 速度与加速度第六章 边界与摩擦力第七章 交互运动:让物体动移动 第三部

flash ActionScript三个版本处理事件的区别

问题:我要重复执行某段代码 解决办法:在  enterFrame  事件中添加监听器和关联处理方法 讨论:在   ActionScript   2.0   中处理   enterFrame   事件 是 很简 单 的 ,你只要创建时间线函数调用 onEnterFrame  然后每次新帧开始时就会自动调用.在  ActionScript  3.0  中有各种各样的事件需要 控制,访问他们也是不难的.如果你熟悉 ActionScript 2.0 中的 EventDispatcher  类的话,你就很

ActionScript 3.0系列教程(4):爽快使用XML

xml|教程 ActionScript 3.0系列教程(3):Document Class特色为我们带来了什么? ActionScript 3.0系列教程(4):爽快使用XML 为什么放弃AS2.0选择AS3.0?如果只允许我说三个理由.那么AS3.0对XML的近乎完美的支持绝对是其中一个. 简单说说AS3.0中对于XML支持的不同吧: .AS2.0对XML的支持勉勉强强,将就着可以用.而AS3.0中对XML的支持是全方位的,极其强大和灵活的. AS2.0对XML的支持不是内建的(build-i

AS3日积月累之二:从AS1和AS2到AS3的观念转变

http://as3blog.com/as3/as3tip-new-philosophy/ AS1/2-AS3观念的转变(Meet with new philosophy)对于AS1.AS2的开发模式来说,灵活是最大的优势.然而,灵活却造成了不稳定.紊乱.这是开发复杂的.长久的项目所忌讳的.关于(AS1/2/1+2)灵活轻便与稳定持久(AS3)的权衡,我个人觉得可以理解为"鱼和熊掌不可兼得",但我希望已经习惯了AS1.AS2的朋友们不要把这个结论想得太悲观. AS3是纯粹面向对象的,相

Flash ActionScript 3.0系列教程

教程 作者的blog: www.kingda.org ActionScript 3.0系列教程(1):与Flash9先来一次亲密接触! Flash Professional 9 ActionScript 3.0 Preview 版本今天发布了,意味着从此我们从此不仅仅只能使用Flex 2来使用AS3.0,更可以使用我们一直很熟悉的Flash IDE来进行AS3.0开发了. 与Flex 2不同,Flash 9 alpha(即上面的Flash Professional 9 ActionScript

Flash ActionScript高级技巧:深入了解Function(2)

高级|技巧 呵呵,上篇帖子大家反映不错,短短几天被几家网站转载.http://www.webjx.com/htmldata/2006-06-15/1150354262.html 废话少说,这次继续上次话题.看看人气情况,如果大家喜欢我这个高级技巧专题,那么日后会陆续发布一些我自己这几年来项目开发笔记中的实用技巧. 利用函数返回函数:有一个proxyObject对象,我们希望根据proxy对象的内容来确定一个方法,来处理myObject对象.当proxyObject是字符串时,我们又希望根据它字符