Chapter2. ActionScript3语言基本元素

  • 用var进行变量声明,未声明数据类型的,默认为untyped
  • 基本类型Boolean、int、Number、String和uint为值类型,其余皆为引用
  • 基本类型即值类型为不变对象,一旦创建,将不会再更改,一切运算和改动将由创建新对象并更改指针指向的内存地址来实现
  • 小数相加不一定是整数:Number类型循环+0.1十次,得出的结论是0.9999999999...,使用Math.round()来修正
  • 类型声明默认值:
    • int默认为0, uint默认为0, Number默认为NaN
    • String默认为null, Boolean默认为false, Array默认为null
    • Object默认为null, 未声明类型默认为undefined
  • NaN与任何Number类型变量进行运算,结果都是NaN
  • NaN与任何int或uint类型变量进行运算,结果都是0
  • NaN的Number类型变量在进行相等判断时,永远只会返回false
  • Flash默认编译模式为Strict mode,相等判断为类型判断,即===
  • typeof用来返回变量类型:
    • Array => object, Boolean => boolean, Function => function
    • int => number, uint => number, Number => number
    • Object => object, String => string, XML => xml, XMLList => xml
  • is用来判断类型是否相同,返回布尔值:trace(9 is Number) // true
  • as用来判断类型是否相同,相同返回对象,不同则返回null:trace(9 as Number) // 9, trace(9 as String) // null
  • in用来判断对象中键是否存在:var a:Array = ["1", "2", "3"]; trace(2 in a) // true, trace(3 in a) // false
  • delete用来删除对象的属性,不能用来删除对象,删除对象请赋值null

Chapter3. ActionScript3 流程控制

  • 循环,for ... in:for (var i in array) { trace(array[i]); }
  • 循环,for each ... in:for each (var value in array) { trace(value); }
  • break与continue控制只会控制当前代码所在的那一层循环结构
  • 可以使用循环标签的方式来控制各个层级的循环流

Chapter4. ActionScript3 中的函数及高级使用技巧

  • 使用函数表达式定义方法(JavaScript中匿名函数定义式样)定义的函数,只有在定义的语句之后这个函数才能被调用到
  • 函数参数传入,如果是基本类型的话可以理解成传值(实质上还是引用,但是基本类型都是不变对象),其他都是传引用
  • 函数语句定义法定义的函数,本质上是一个MethodClosure类对象
  • 函数表达式定义法定义的函数,本质上是一个Function-N,这个N会根据你定义的函数个数而变化

Chapter5. 类和对象

  • 构造函数只能使用public访问控制
  • 构造函数无法声明返回类型
  • 类分为动态类和密封类,动态类需要在类名前加上dynamic关键字,动态类可以运行时添加属性和方法
  • 如果要在一个as文件内塞入多个类的话,package关键字内只能定义一个和当前文件同名的类,其余的类必须定义在package外
  • 定义在package外的类称为包外类,必须当前类文件中的成员类才能访问

Chapter7. 命名空间

  • ActionScript3的命名空间在使用上比我接触过的其他语言的命名空间要灵活,实用性稍高

Chapter8. 复合与继承

  • 子类无法继承父类的静态成员,但是在子类中可以不加类名直接访问父类的静态成员。举例来说A类有一个静态函数hello,B类继承A类,但是直接使用B.hello()将会报错,但是在B类内直接使用hello()则不会报错,不需要写A.hello()
  • 重写(Override)只能重写实例方法,不能重写实例属性
  • Override的时候必须在函数public function声明关键字前加上override关键字
  • 父类中函数b调用了其私有函数a,而子类中由于私有函数a无法被继承,导致调用子类继承自父类的函数b的时候,其内部的实现仍旧是父类的a,而不是子类自己实现的同名函数a
  • 使用super来获取父类引用
  • 使用final来终止继承
  • ActionScript3中类只能单继承

Chapter10. 抽象类和接口

  • ActionScript3中没有abstract关键字,所以抽象类和方法没有关键字进行规范化
  • 接口不可定义常量,所有方法强制为public,不可添加访问修饰符
  • 接口可以多继承,子接口自动继承父接口的所有方法定义

Chapter12. 数组:Array

  • 数组的复制分浅复制和深复制之分,浅复制只是将当前数组的引用赋给一个新的变量而已,而深复制则是完全的值拷贝。这和PHP中的等号赋值和clone是一样的概念
  • 浅复制:var copy:Array = originalArray.concat();
  • 深复制:
    • var foo:Array = ["this is a string", [1,2,3], {name: "jonathan", gender: "male"}];
    • var fooBA:ByteArray = new ByteArray();
    • fooBA.writeObject(foo);
    • fooBA.position = 0;
    • var bar:Array = fooBA.readObject() as Array;
  • 数组循环函数:
    • forEach(callback:Function, thisObject:* = null):void,操作数组中每一项元素,无返回
    • filter(callback:Function, thisObject:* = null):Array,将符合条件的元素提出来,构成新数组返回
    • map(callback:Function, thisObject:* = null):Array,操作数组中的每一项元素,并构成新数组返回
    • some(callback:Function, thisObject:* = null):Boolean,单个元素为真,则返回真,否则为假
    • every(callback:Function, thisObject:* = null):Boolean,所有元素皆为真,则返回真,否则为假

Chapter13. 字符串:String

  • indexOf是使用字符串匹配来查找子字串,而search则是使用正则来查找子字串
  • substring和slice都是使用开始位置和结束位置来获取子字串,substring无法使用负数index,slice可以
  • substr是使用开始位置和字串长度来获取子字串
  • split分割字串可使用RegExp正则来作为参数

Chapter18. 事件发送和处理

  • 首先来看几个概念,完成一个事件处理流程需要三个概念:
    • Event对象,用来描述事件,并作为转发载体的对象:使用静态变量定义事件的type(相当于事件的名字),随用super调用父类的构造函数
    • EventDispatcher对象,事件发送对象,事件的触发对象,必须有一个函数调用到了dispatchEvent(*:Event),用来发送事件
    • 逻辑处理对象,这个对象没有需要继承的父类,只需要将事件逻辑处理函数暴露出来就行了(这个函数可以是private的函数)
  • 完整的事件流程:
    • 首先保证上述的三个概念都已经实现完毕了
    • 在主逻辑中实例化EventDispatcher对象:ed = new EventDispatcher对象
    • 在主逻辑中实例化逻辑处理对象:handler = new 逻辑处理对象
    • 绑定事件:ed.addEventListener(Event对象.事件类型, handler.逻辑处理函数)
    • 最后发送事件:ed.发送事件函数,这个函数里应该会调用dispatchEvent来真正发送一个事件