深入BroadcasterMX
作者:N神_net 类型:闪吧BBS 来源:闪吧
AsBroadcaster看不到原文件,这个跟那个差不多,只有一点不同,可以研究一下广播是怎么实现的。
如果你看这帖子格式怪怪的,可以到这看,格式清晰一些。。http://nshen.net/blog/article.asp?id=374
B:写在函数的原型-prototype上
到了as2中:
这个haha方法写到哪了呢?经过h人提点,看了看asv,答案果然是h人所说的,写在prototype上的,相当与B的写法.
知识点:2.
调用函数的时候,会在函数内部自动生成一个argments对象,这个对象是你传入函数的所有参数组成的数组。
arguments.shift()是数组的第一个元素。
知识点:3.
apply是Function类的方法,也就是说所有的function都有这个方法。这个方法使一个函数在另一个域中工作,不知道描述对不- -b看例子吧
明白点了吧,
如果你看这帖子格式怪怪的,可以到这看,格式清晰一些。。http://nshen.net/blog/article.asp?id=374
| 以下内容为程序代码: class mx.transitions.BroadcasterMX { #include "Version.as" //版本信息 private var _listeners:Array; //_listeners列表 static function initialize (o:Object, dontCreateArray:Boolean) { /* 静态方法initialize(),用来把参数o变成事件源 dontCreateArray这个参数如果设置为true则不给o创建_listeners数组,偶不知道为什么有这个参数, 貌似不给o创建_listeners数组,广播就没有用了。哪位高人知道为什么,希望给我解释解释。。 */ if (o.broadcastMessage != undefined) delete o.broadcastMessage; //如果对象o已经存在broadcastMessage,则删除 o.addListener = mx.transitions.BroadcasterMX.prototype.addListener; //使o对象具有addListener方法,见后边知识点1 o.removeListener = mx.transitions.BroadcasterMX.prototype.removeListener; //使o对象具有removeListener方法,见后边知识点1 if (!dontCreateArray) o._listeners = new Array(); //_global.ASSetPropFlags (o, "addListener,removeListener,_listeners", 1); //隐藏addListener,removeListener,_listeners } function addListener (o:Object):Number { //填加兼听者,送给监听者一个broadcastMessage方法,并把他填到广播器的订阅列表_listensrs中 this.removeListener (o); if (this.broadcastMessage == undefined) { this.broadcastMessage = mx.transitions.BroadcasterMX.prototype.broadcastMessage; //_global.ASSetPropFlags (this, "broadcastMessage", 1); } return this._listeners.push(o);//这里返回数组长度 } function removeListener (o:Object):Boolean { //从广播器列表中删除一个监听器 var a:Array = this._listeners; var i:Number = a.length; //这里用while没用for,就是遍利列表,从中删除o,如果列表空了,就把broadcastMessage也删了 while (i--) { if (a[i] == o) { a.splice (i, 1); if (!a.length) this.broadcastMessage = undefined; return true; } } return false; } function broadcastMessage ():Void { //发出广播函数 var e:String = String(arguments.shift()); //将传入的第一个参数转换成String类型,这个参数应该是个函数名,见后边知识点2 var a:Array = this._listeners.concat(); //concat方法参数为空的时候返回数组的副本(见帮助) var l:Number = a.length; for (var i=0; i<l; i++) a[i][e].apply(a[i], arguments); //遍利列表执行函数,并把参数传过去,apply用法见知识点3 } }; |
知识点:1.
as1中给自定义类填加方法有两种方法:
A:写在函数中
| 以下内容为程序代码: function A(){ this.myFunc = function(){trace("A.myFunc");} } |
| 以下内容为程序代码: function B(){ } B.prototype.myFunc = function(){ trace("B.myFunc"); } |
到了as2中:
| 以下内容为程序代码: class a{ function haha(){ trace(".......") } } |
知识点:2.
调用函数的时候,会在函数内部自动生成一个argments对象,这个对象是你传入函数的所有参数组成的数组。
arguments.shift()是数组的第一个元素。
知识点:3.
apply是Function类的方法,也就是说所有的function都有这个方法。这个方法使一个函数在另一个域中工作,不知道描述对不- -b看例子吧
| 以下内容为程序代码: a = {}; a.toString = function() { return "我是a"; }; function 函数() { trace(this); trace(arguments); } 函数(1, 2, 3); //输出:_level0 1,2,3 函数.apply(_root, [1, 2, 3]); //输出:_level0 1,2,3 函数.apply(a, [1, 2, 3]); //输出:我是a 1,2,3 |
for (var i=0; i<l; i++) a[i][e].apply(a[i], arguments);
看这个是类中最后遍历那段,遍历列表,a[i]为监听器列表中的每个元素,a[i][e]就是是每个对象的e方法,a[i][e].apply(a[i]),就是在a[i]域中执行a[i][e]方法,别忘了把参数传过去,就这样了。a[i][e].apply(a[i], arguments)。好了完了,上边有个问题谁给回答了~谢谢
睡觉了88
责任编辑:uufeng 时间:2005年11月3日
- 最近更新
