发新话题
打印

[编程] delegate实现原理

delegate实现原理

==========================源码===============================
class org.red5.utils.Delegate {
public static function create(target:Object, handler:Function):Function {
  // Get any extra arguments for handler
  var extraArgs:Array = arguments.slice(2);
  // Declare delegate variable (MTASC compatibility)
  var delegate:Function;
  // Create delegate function
  delegate = function() {
   // Augment arguments passed from broadcaster with additional args
   var fullArgs:Array = arguments.concat(extraArgs, [delegate]);
   //var fullArgs:Array = arguments.concat(extraArgs);
   // Call handler with arguments
   return handler.apply(target, fullArgs);
  };
  // Return the delegate function.
  return delegate;
}
}
==========================问题============================
1、[delegate]代表什么,即[]起什么作用?
2、定义function addEventListener(p_event:String,p_obj:Object,p_function:String):Void{...}
     使用addEventListener("click",Delegate.create(this,MyClickHandler))
为什么不使用addEventListener("click",this,MyClickHandler);
Delegate.create返回的是一个Function,怎么和addEventListener(p_event:String,p_obj:Object,p_function:String)对应上呢?

请大家不吝指教`````````````,谢谢
俺刚学几天ACTIONSCRIPT,可能问的都是基础问题,谢谢

TOP

请高手帮忙啊

TOP

1.[delegate]代表什么,即[]起什么作用?

::>把delegate这个Function放入数组中去,相当于new Array(delegate)

2、定义function addEventListener(p_event:String,p_obj:Object,p_function:String):Void{...}
     使用addEventListener("click",Delegate.create(this,MyClickHandler))
为什么不使用addEventListener("click",this,MyClickHandler);
Delegate.create返回的是一个Function,怎么和addEventListener(p_event:String,p_obj:Object,p_function:String)对应上呢?


::>这里说得不清楚,可能你看的是两种版本,发完整上来,说明AS2.0还是AS3.0...
有公司愿意招我不?

my blog

TOP

方便的话QQ上聊,短消息上发QQ 号给我,谢谢

TOP

===========================部分源码red5======================
class com.gskinner.events.GDispatcher
{
        static var $instance:GDispatcher = undefined;
        private var gDispatcher_listeners:Object;       
        static function initialize(p_obj:Object):Void
        {
                if ($instance == undefined) { $instance = new GDispatcher; }
                p_obj.dispatchEvent = $instance.dispatchEvent;
                p_obj.eventListenerExists = $instance.eventListenerExists;
                p_obj.addEventListener = $instance.addEventListener;
                p_obj.removeEventListener = $instance.removeEventListener;
                p_obj.removeAllEventListeners = $instance.removeAllEventListeners;
        }
               private function addEventListener(p_event:String,p_obj:Object,p_function:String):Void
        {
                if (gDispatcher_listeners == undefined) { gDispatcher_listeners = {}; _global.ASSetPropFlags(this,gDispatcher_listeners,1); }
                var listeners:Array = gDispatcher_listeners[p_event];
                if (listeners == undefined) { gDispatcher_listeners[p_event] = listeners = []; }
                if (GDispatcher.$indexOfListener(listeners,p_obj,p_function) == -1) { listeners.push({o:p_obj,f:p_function}); }
        }
。。。。
}
=========================================================
用了GDispatcher.initialize(obj:Object)方法,然后调用
obj.addEventListener("click",Delegate.create(this,MyClickHandler))

as2.0版

TOP

Function 也是个对象,所以可以对应上
有公司愿意招我不?

my blog

TOP

仅是对应上了前两个参数
addEventListener(p_event:String,p_obj:Object,p_function:String)
并且p_obj表示的侦听器对象,p_function表示的是该侦听器对象上的事件处理方法
而要是p_obj对应上的只是一个Function对象的话,那addEventListener不就失效了?

TOP

class com.gskinner.events.GDispatcher
{
static function $dispatchEvent(p_dispatchObj:Object,p_listeners:Array,p_eventObj:Object)
        {
                var i:String;
                // trick from MM: fixes problem with users removing items from listeners while it executes.
                for (i in p_listeners) {
                        var o:Object = p_listeners.o;
                        var oType:String = typeof(o);
                        var f:String = p_listeners.f;
                        if (oType == "object" || oType == "movieclip") {
                                if (o.handleEvent != undefined && f == undefined) {
                                        o.handleEvent(p_eventObj);
                                } else {
                                        if (f == undefined) { f = p_eventObj.type; }
                                        o[f](p_eventObj);
                                }
                        } else { // function
                                o.apply(p_dispatchObj,[p_eventObj]);
                        }
                }
        }
...
}
======================================================
想了下,应该是像你说的话,p_obj对应Function,事件触发时,使用了
o.apply(p_dispatchObj,[p_eventObj]);

是这样吧

非常感谢版主ycccc8202 (春叶飘零[CYPL]) 的帮助

TOP

这个delegate是什么功能?我也在研究red5

TOP

发新话题