(转)AS3函数动态添加实例属性

var shot:Function=function():void{
        shot['times']++;
        trace("shot():times:"+shot['times']);
}
shot['times']=0;
shot();
//为什么里面的shot['times']改为shot.times时就不行了。shot['times']是不是叫用到了数组运算符?
//数组运算符除了在程序运行时需要访问一个成员,而这个成员的名字到了运行时才会知道的情况下还有哪个情况下需要用?
var shot:Function=function():void{
        shot.times++;
        trace("shot():times:"+shot.times);
}
shot.times=0;
shot();
为什么是错的?

 

//基于内存性能的考虑, as3.0中大部分类都是密封类,不能动态添加属性的(既然不能动态添加 就当然不能动态访问了)


比如:

var s:String = "abc";
s.tt = 123; //这里肯定报错
//场景 1, 图层'图层 1', 帧 1,3 行 1119: 访问可能未定义的属性 tt (通过 static 类型 String 引用)。


但也有例外,比如MovieClip(影片剪辑) 或者 Object  或者  Function ,根据统计,as3中有几个类是动态类来的

Error 
RegExp 
Date 
Function 
Class 
Array
MovieClip

这些都是动态类,可以动态添加属性

加是可以加了,但加也有一定规则,需要使用数组访问符来加 和 访问

亦即是下面说的


数组访问符有两种作用

1. 动态设置属性
2. 动态获取属性(相对意义上的动态)


不能使用点语法 .    ,要使用数组访问符 ,但有一个例外,MovieClip是可以直接使用点语法来访问动态属性

如:


var d:Date = new Date();
d.a = 1; //报错
d["a"] = 1; //正常编译
//其它动态类只能使用数组访问符



var m:MovieClip = new MovieClip();
m.a = 1; //正常编译m["a"] = 1; //正常编译
//MovieClip 两种均可


这个是第一点,动态设置


关于第二点,动态访问,道理一样,不能使用点语法,所以要用数组访问符,

另外一个作用就是批量访问对象,比如你场景中建了十个影片剪辑   给它们的实例名分别是  mc1  mc2 mc3 ...... mc9  mc10

这种有规律 (mc + 数字)的命名时,如果我想批量为它们添加鼠标事件的话 就可以用数组访问符



  1. for(var i:uint=1;i<10;i++){
  2.     this["mc" + i].addEventListener(MouseEvent.CLICK,onClick_func);
  3. }
  4. function onClick_func(_evt:MouseEvent):void{
  5.    trace(_evt.target.name);
  6. }
复制代码





因为你不能用  "mc" + i .addEventListener(MouseEvent.CLICK,onClick_func);

"mc" + i  不是一个对象 ,你要作为对象访问  必须使用   类似 this["mc" + i]  这样的语法来获取对象




至于楼主两次提到的应用环境,在面向对象编程中,一般不提倡使用动态属性,
多数时间是习惯了as2.0编程的人,习惯了as2全部动态类,喜欢加啥就加啥 喜欢怎么加就怎么加时使用,一般有了一定编程经验的as3.0人员一般少用

比如

  1. for(var i:uint=1;i<5;i++){
  2.     this["a" + i].id = i;
  3.     this["a" + i].addEventListener(MouseEvent.CLICK,onClick_func);
  4. }
  5. function onClick_func(_evt:MouseEvent):void{
  6.    switch(_evt.target.id){
  7.     case 1:
  8.       trace("首页");
  9.     break;
  10.     case 2:
  11.       trace("产品信息");
  12.     break;
  13.     case 3:
  14.       trace("公司文化");
  15.     break;
  16.     case 4:
  17.       trace("关于我们");
  18.     break;
  19.    }
  20. }
复制代码




通过添加一个id的动态属性 用来在事件处理函数中识别区分点的是哪一个按钮

一般多数是这样使用 ,其它使用就是像我上面说的  通过字符组合出的对象名  动态获取一个对象的引用 







下面这段我本来想回复楼主的 但写着写着感觉 又长又臭 就不续了 大概意思个就是了



数组访问符有两种作用

1. 动态设置属性
2. 动态获取属性(相对意义上的动态)

动态与静态是相对的概念,在计算机概念上,编译文件的时候(即按下ctrl+Enter时),编译器(你不懂的话,先可以理解成flash软件)会先对源代码中 声明的对象 属性 方法  以及场景中所有对象
(比如一个图片 它其实是一个bitmap对象   一个影片剪辑  它其实还是一个MovieClip对象 只不过存在于场景中 显示出来罢了 实际在文件内部它还是识别为一个对象)

编译器会对这些已经存在的对象作一次点名,并把它们记录在一个“列表”中(这个列表是 flashPlayer底层自动维护的 我们不用理)
因为这个表已经记录在案所有编译阶段已经声明的对象,程序使用它们的时候 ,就可以在这个列表中查找

说到这里 不得不说一下内存空间的事情了

因为不同的数据类型 它们在内存中都有一定的固定字节长度  编译阶段已经声明的对象 运行时内存空间就已经申请好了
不会频繁向系统申请内存了 (系统的内存不是你想要就要 它像一个停车场 需要调度才可以腾位置的 太多的空位间隔 就要把车移动腾在一起 以整理出大空地(内存))   这个腾空间的概念 差不多就是内存整理 ,需要浪费一定的系统资源的


所以说静态编译的对象 会相对省系统资源 ,这个也是as3.0中大部分类都默认为密封类(即不能随便添加动态属性)的原因了



上面这段是解释为什么不能用  .属性 来添加 动态属性 的原因,as3中大部分对象都是密封类,不能直接使用  .属性 来添加
posted @ 2012-07-18 12:08  ☆A希亿  阅读(4046)  评论(0编辑  收藏  举报