Flash Actionscript3殿堂之路

/**
 * 
 * 殿堂之路读书笔记,很多是原文摘抄,特此声明
 * 记下自己觉得重要的东西(未完待续)
 * 
 */
生成数组浅复制的方法很简单,只需要调用原数组的slice方法或者concat方法,不传任何参数,即可生成
原数组的浅复制。用法示例如下:
var copy:Array = originalArray.slice();
var copy:Array = originalArray.concat();

concat和push的相同之处在于,都是将参数中的元素按顺序加到数组的后面
concat和push的不同点在于:
1.concat不改变原有数组内容,而是生成一个新数组返回。push直接改变原数组内容
2.当参数是数组时,concat和push的行为不同。concat会将数组按顺序分开成各个元素按顺序加入,而push则把这个是数组的参数当成一个元素加入原数组后面
数组的indexOf()和lastIndexOf()方法检索数据时,使用===来进行比较,这就意味着字符串"123"与数字123不相同
XML操作
如果XMLList对象只包含一个元素,那么可以直接将XMLList对象当成XML对象,使用XML类方法
在使用.和@来操作XML时,如果有同名的子元素存在,则返回的是XMLList对象,此时不能使用
.和@来修改,会发生运行时错误.

无论是使用.和@来操作XML,都可以在其中使用< > == * 以及动态访问符[]等符号来进行操作,代码如下:
kingdaXML.site.(pageview < 100000);
kingdaXML.site.(@name == "actionscipt");			//这个我常用
kingdaXML.site.@*.toXMLString();
myXML.i.(@[value + 1] == "flash lover");			//这个我常用

表达式中可以使用正则表达式或者字符串的match等函数,如下:
trace(kingdaXML.site.(check(pageview))				//式子中自定义函数必须返回Boolean值
function check(t:*):Boolean							//自定义的check函数
{
	trace(t is XMLList);
	trace(t.length());
	if(t < 1000000) return true;
	return false;
}
trace(kingdaXML.site.(pageview.match(/^5\d+/)));	//使用正则表达式

创建、组合、改变XML的方法(我很少用到)
appendChild(child:Object):XML;						//在当前子元素列表之后添加
prependChild(child:Object):XML;						//在当前子元素列表之前添加
insertChildAfter(child1:Object,child2:Object):*;	//在子元素child1值后添加
insertChildBefore(child1:Object,child2:Object):*;	//在子元素child1值前添加
第十八章:事件发送和处理
Event类及其子类都有一个clone()方法,创建自定义事件类时,尽量override原来的clone()方法,
使用clone()方法返回当前事件对象的一个拷贝,这个clone()方法一般不需要我们手工调用,当我们将
一个事件对象重复发送时,EventDispatcher类会自动调用clone()方法,产生这个事件对象的拷贝

上面这句话说明,在触发事件时是复制了对象的而且还是深复制,所以在页游很多模块间通讯最好不要使用事件沟通,
使用公共接口调用效率会好一点,使用事件是要耗费一定的性能的(个人观点,欢迎拍砖)

Event类里面还有个formatToString()方法,以前忽视了记之。

isDefaultPrevented()、preventDefault()和Event类和子类第三个参数cancelable结合使用组织事件的默认行为发生

stopImmediatePropagation()、stopPropagation()阻止事件的传播,除非万不得已我很少用,因为我觉得用这两个方法就表明设计可能会有问题
事件流机制三阶段:捕获、目标、冒泡,一般仅在目标或者冒泡阶段捕获事件,事件流机制仅适用于显示编程
EventDispatcher类还有个willTrigger()方法,以前也忽视了,记之。
ASDOC解释如下:
hasEventListener() 与 willTrigger() 方法的区别是:hasEventListener() 只检查它所属的对象,而 willTrigger() 方法检查整个事件流以查找由 type 参数指定的事件。 当从 LoaderInfo 对象调用 willTrigger() 时,只考虑调用方可以访问的侦听器。

殿堂之路如下:
不同点在于如果时间发送者处于显示列表上,那么willTrigger()不但检查该显示对象上的侦听器,还会检查该显示列表对象在事件流所有阶段中的所有父级上的侦听器
第十六章:异常和错误的捕捉和处理
AS3 异常分为两种:同步异常和异步异常。
Error和其子类一般用来处理同步时的异常,异步异常所产生的异常用相关异常事件ErrorEvent类表示。
这两种异常本质以及处理方式不同:同步异常使用Error来处理,异步异常使用事件侦听机制来处理。而且异常事件ErrorEvent并不是Error的子类,而是ErrorEvent的子类

AS3中一旦try语句块中某一行代码抛出异常,则该行代码以后的语句都不会执行,java也是如此

try后面至少要有一个catch或者finally语句块,否则报错
try后可以跟多个catch块
catch语句里还可以嵌套try-catch-finally结构

一旦异常发生,异常处理机制开始执行时,任何一门语言在这方面的系统开销都比较大,AS3也一样

flash.events.ErrorEvent包含用于处理有关网络和通信操作的flash player运行时错误属性和方法,IOErrorEvent等类继承了他

UncaughtErrorEvent.UNCAUGHT_ERROR这个类可以看一看
第二十章:Actionscript 3视觉编程精要
ActionScript3的显示对象结构模式是典型的合成模式(Composite),准确的说,是安全方式型的合成模式,即:只有容器才拥有管理子对象的方法,非容器对象没有管理子对象的方法,父容器可通过getChild()、getChildAt()等方法访问到每一个子对象,每一个子对象都可以通过parent属性访问到父容器。所以,Actionscript3的显示对象结构又是一个双向的树图。

Flash pro生成的SWF如果没有指定文档类那么默认的MainTimeLine就是其主类。

加载AVM1影片到AVM2SWF中时,Flash player会自动创建一个AVM1Movie的实例来包装这个AVM1影片,也就是说AVM1Movie表示在AS3中遇到的AS及其以前的影片

root属性的解释(AS3DOC):
对于加载的 SWF 文件中的显示对象,root 属性是此 SWF 文件所表示的显示列表树结构部分中的顶级显示对象。对于代表已加载图像文件的位图对象,root 属性就是位图对象本身。对于第一个加载的 SWF 文件的主类的实例,root 属性就是显示对象本身。Stage 对象的 root 属性是 Stage 对象本身。对于任何未添加到显示列表的显示对象,root 属性设置为 null,除非它已添加到符合以下条件的显示对象容器:不在显示列表中,但属于已加载 SWF 文件中顶级显示对象的子级。 
例如,如果您通过调用 Sprite() 构造函数方法创建新的 Sprite 对象,则其 root 属性将为 null,除非您将其添加到显示列表中(或添加到不在显示列表中但属于 SWF 文件中顶级显示对象的子级的显示对象容器中)。
对于加载的 SWF 文件,即使用于加载文件的 Loader 对象未在显示列表中,SWF 文件中的顶级显示对象也会为其本身设置 root 属性。在 Loader 对象添加为对其设置 root 属性的显示对象的子级前,它不会设置自己的 root 属性。
第二十一章:DisplayObject类与矢量图、位图
对于MovieClip和Sprite来说,使用Graphics对象绘制出的图像不是Shape对象,也不是其对应类的子对象,使用numChildren查看会发现其子对象为0.且绘制出来的图形始终处于所有子对象的后面。

文本框后追加字符串使用appendText()效率比+=高

第二章:ActionScript 3语言基本元素
声明变量时如果不加上数据类型,那么AS2种会默认该对象为Object,但在AS3中不是这样不加上数据类型的声明,那么该变量就会被归为未声明类型(untyped)

const的一些东西
对于值类型而言,常量保有的就是值,对于引用类型来说,常量持有的是引用。注意,对于引用类型而言,常量只能保证持有的引用不变,并不能保证引用对象自身的状态不发生改变。
const foo:Array = [1,2,3];
var b:Array = foo;
b[1] = 100;
trace(foo); //输出:1,100 说明foo指向的数组内容被改变了
foo = [2,3]; //这儿会报错
AS3中基础数据类型(int、uint、Number等)也是对象,不过是通过不变对象实现的(immutable object),java中基础数据类型不是对象,对应的包装类才是。如,int的包装类是Integer,double的包装类是Double,C#中基础数据类型都是System命名空间的对象。每个基础数据类型名字,都是各自对应的类名的缩写或者别称。比如,int就是类System.Int32的缩写,double是System.Double的缩写。
Number类型是64位浮点数(其实值支持53位的精度,54位以后不保证精度)

除法一般使用Number类型
小数相加不一定能得到整数
不要让数值差距过大的浮点数相加减,结果可能有偏差
String在计算长度时,空格等特殊字符也算一个字符,字符串中特殊字符用\来转义
数组最多容纳2的32次方 - 1个元素
Object中也能存放函数
模运算中运算对象不是整数,可能会出现一些意外的小数

第三章:Actionscript 3流程控制 
ActionScript3种允许表达式的值不是Boolean值.如果一个条件表达式的值不是布尔值,那么会自动执行类型转换,其将转换成相应的Boolean值,这一点与Java不同。

switch使用全等运算符(===)来判断括号中的表达式和case分支的表达式相符合,这意味着比较不会默认调用类型转换,二者必须属于一种类型。

第四章:Actionscript 3中的函数及高级使用技巧
函数语句定义法定义的函数在编译时会被提升到最前面,而函数表达式定义法只能先定义再使用,只有定义后面的语句才可以成功调用。代码如下:
testA();	//将这一行移到最后就能编译成功
testB();
var testA:Function = function():void {trace("A");};
function testB():void {trace("B");}

使用函数语句定义法,则this关键字牢牢指向当前函数的定义域,若使用函数表达式定义法,则随着函数附着的对象不同,this关键字也随之改变。函数的apply()和call()只能改变函数表达式定义的函数this指向,而不能改变函数语句定义法定义的函数

函数语句定义法与函数表达式定义法诸多差异在于底层实现机制的不同

函数中arguments参数是顶级类,在函数中使用arguments时可以使用arguments.callee()递归.
一旦使用了...(rest)关键字,那么arguments就不能再使用了。

以前忽略了getQualifiedSuperclassName()这个函数,记之

AS3中不支持重载,可以使用...args近似的模拟重载
声明常量,声明时就必须赋值
静态成员和实例成员名称相同时,实例属性与方法会优先访问到,静态属性和方法会被屏蔽
this关键字只能用于实例属性和实例方法中,静态类和静态方法中不能使用

第六章
AS3中控制访问默认是internal,只是java中没有这个关键字
AS3包外类与java的内嵌类不同,AS3内部类不对外可见



你可能感兴趣的:(Flash Actionscript3殿堂之路)