as学习笔记(二二)--一些杂项
sshong 发表于2008年7月10日 21:50:00 更新于2008年9月3日 10:06:00
1. for...in和for each...in使用注意
今天碰到一个奇怪的问题,在for each in一个Array,总是会出错!经过仔细研究发现,原来我给这个数组添加了动态属性(几个字符串),而数组中存放的元素为object,我原本想在循环里面引用object元素的一些属性,而其实在for in数组的时候,它把这些动态字符串属性也循环到了,自然这些字符串动态属性是引用不到object的这些属性的,于是出错!
for in,以及for each...in会循环array所有的动态属性,以及array中存放的元素,一定要注意,不只是循环数组中存放的元素!

2. setter和getter的妙用
以前在写c++代码时经常在想java怎么那么傻,搞个什么setter和getter出来,既然留了门,那不就等于public么,不过最近在as里用起来,感觉有些地方还是很不错的。
A、setter或者getter一个不是普通的成员变量,假定某类中有一个sprite,我们总是要在类内部或者在类外部获取该sprite的高、宽,每次都***.width, ***.height岂不是很累,而且如果要外部访问的话需要将sprite设为public,我们可以
private function get ...():Number{return ***.width};
以后直接...即可,既不会暴露该sprite,而且代码看起来也要舒服很多。
B、setter不一定要和某成员变量联系起来,譬如
public function set data(...)...
,我们可以在set中做很多工作,譬如把data转换为我们需要的数据,根据数据刷新显示等等,不一定是要有一个data属性与之相对应!

3. 函数表达式定义的好处
经常遇到一种情况就是很多eventdispatcher是静态的,无法动态添加属性,而且经常是异步的譬如loader,我们要在loader complete时,不光需要loader中的data数据,还需要一些其他数据时在loader构造时所在的函数传递进来的。
譬如
function addloader(src:String):void
{
  var loader:URLLoader = ...;
  loader.addEventListener(Event.COMPLETE, completeHandler);
}
在completeHandler中,我们一方面要得到loader的data,一方面还要用到src,这时候就麻烦了,因为listener不能有多个参数,只能有一个形参,而loader中又得不到src!这时候函数表达式定义法就可以出马了!
completeHandler如果是用标准定义,是methodclosure的实例,是一个静态类实例,而如果用表达式定义,是一个动态类实例(殿堂之路讲的很明白),可以往其中添加属性!
function addloader(src:String):void
{
  var loader:URLLoader = ...;
  var completeHandler:Function = function(evt:Event):void
  {
   trace(completeHandler["src"]);
  }
  completeHandler["src"] = src;
  loader.addEventListener(Event.COMPLETE, completeHandler);
}

4. 我的一个观点:变量在离开作用域时,仅仅相当把该变量对应的内存空间的引用减少了1个!

5. 关于设置displayobject的mask,这个mask必须被加入了显示列表,被mask掉的区域无法接受鼠标事件,但是仍然计入displayobject的width和height中!

6. 将xml的某一部分提取出来进行修改,还是会导致该xml全局发生改变

7. 要想在某实例A外部B中异步触发(在某动作发生时)A的方法,
一种这个外部B跟A有关联,譬如B是在A的某方法中new出来的,这时可以自定义一个event,然后对B addlistener到A对应类的某方法,在B对应的类中某处dispatch这个event;
还有一种直接把A以及A的该方法名传递给B中,在B中建一个Function等于A["方法名"],在B中某处就可以直接调用该方法了,但是这种方法必须保证A的该方法是public的或者说要在B中能访问的,因为要在B中调用!

8. 关于Displayobject的root属性,在显示列表中并不一定就是主文档类的实例!如果某displayobject是stage.addChild出来的,那么它的root将与其stage相同!
标签:无分类:As3&Flex阅读:3093
评论
暂无评论
添加评论
您的大名,限长10汉字,20英文(*)
电子信箱(*)
您的网站
正文,限长500汉字,1000英文(*)
验证码(*) 单击刷新验证码
联系我
博客订阅