先贴张图:
每个矩形代表一个对象。CA代表class A本身,它持有三个引用:TA是实例特征对象(traits object),存储了实例的属性,这些属性是由该类定义的。TCA是类特征对象(class traits object),代表了类的内部类型并了该类定义的存储静态属性。PA是原型对象(prototype object),它总是关联着由构造函数(constructor)属性最初添加的类对象。
实际上,prototype算是个历史遗留问题。在as1.0中,prototype是用来实现class定义和继承的:
// base class function Shape() {} // Create a property named visible. Shape.prototype.visible = true;// Make Circle a subclass of Shape.
// Make Circle a subclass of Shape. Circle.prototype = new Shape();
这样,Circle就相当于继承了Shape。
到了AS2.0,已经添加了一些新的关键字,class, extends, public, private等,但prototype的作用还是一样的,extends关键字只不过简化了创建子类的过程。
直到AS3.0的诞生,添加了traits object。创建子类时,继承的属性直接从父类中复制到了子类的traits object中,因此带来了更高的效率和时间的节省。因为在之前的AS版本中,Flash Player要通过整个prototype链来查找名称。
因此,在现阶段的AS3.0中,prototype已经几乎失去了使用的价值。
AS3中的这两个并列的继承体系,产生了一个兼容性问题:
ECMAScript, Edition 4 draft language specification 要求使用prototype inheritance(原型继承),这意味着核心类的属性和方法是定义在其原型中的。
另一方面,Flash Player API要求使用fixed property inheritance,这意味着核心类的属性和方法是使用const、var、function关键字定义在类定义中。
另外,使用固定属性会比使用原型版本带来极大的运行时性能提升。
于是,AS3.0的核心类同时使用了两套集成体系,即每个核心类都包含了两套属性和方法,但可以用AS3这个命名空间来区分。类似:
var nums:Array = new Array(1, 2, 3); nums.AS3::pop(); trace(nums); // output: 1,2use namespace AS3;
var nums:Array = new Array(1, 2, 3); nums.pop(); nums.push(5); trace(nums) // output: 1,2,5
AS3为这两种体系提供了编译参数:
-as3 和 -es,分别代表AS3和ECMAScript。
Adobe Flex Builder and Adobe Flash CS3 Professional的默认编译设置是 -as3 = true 和 -es = false.
参考:
http://livedocs.adobe.com/flex/3/html/help.html?content=04_OO_Programming_12.html#136347