About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • Mar

    20

    如果 AS 开发者认为 AS3 中只有通过关键字  new + 类的构造方法 才能创建对象,那就错了。AS3 仍然允许使用 new + 函数名(正式术语为“构造函数”) 创建动态对象,这里的函数名是指函数闭包的名称,可以是局部函数(内嵌函数)、也可以是全局函数,但不能是类的方法。

    通过 new + 函数名 创建对象是 AS1 中面向对象的方法(从 Flash5 & AS 1.1 版本开始的),并通过函数原型对象(prototype 属性引用该对象)来实现传统编程语言中的类继承,只是这种模拟的语法因为与传统业界的编程语言相差太大,并没有得到传统业界程序员的太多认可。

    下面附上一个样例代码:

    package
    {
        import flash.display.Sprite;

        public class AS1 extends Sprite
        {
            public function AS1()
            {
                //定义部份
                function A():void{
                    this.p2 = "p2a";
                }
                function B():void{
                    this.p2 = "p2b";
                }
                A.prototype.p1 = "p1";
                A.prototype.fun = function ():void{
                    trace("a_fun");
                }
                //测试部份
                var a:* = new A();//它们都是无类型的,所以用星号*表示,而不是函数名A
                var b:* = new B();

                trace(a,b);//[object Object] [object Object]
                trace(a.p1);//p1
                trace(a.p2);//p2a
                a.fun();//a_fun
                trace(b.p2);//p2b
            }
        }
    }

    事实上函数支持原型链之外, AS3 的类也支持原型链,在原型对象中定义方法,比如常用的 Object 类的 toString() 方法就在原型对象中定义,所以子类不能使用传统编程语言那样可以使用 override 修饰词去覆盖这个超级根类中的方法,子类直接编写属于自己的 toString() 方法,不需要 override 修饰词(如果写上 override 修饰词编译器反而会报错)。

    备注:在类的原型对象中定义方法时,如果是动态类,类似 Object 类这样可以直接使用点语法,但如果是一个静态类,使用点语法并不能通过编译器,因为静态类的属性或方法中并不存在原型对象中定义的内容,只有在运行期才能确定,所以要将点语法改为中括号 [ ] 访问原型对象中定义的内容。