Flex Class object(类对象)构成、traits和prototype

7 篇文章 0 订阅

先贴张图:


每个矩形代表一个对象。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,已经添加了一些新的关键字,classextendspublicprivate等,但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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值