¡¡¡¡ÔÚc#ÖÐÓÐdelegate£¬»¹ÓÐÌØÊâµÄ¿ÉÒÔÖ±½ÓÓ¦ÓÃÓÚʼþ±à³ÌµÄdelegate£¬ÄǾÍÊÇevent¡£¶øÔÚjsÖÐûÓÐc#µÄevent£¬¸üûÓÐdelegate£¬ÓеÄÖ»ÊÇdomÔªËØÄÚÖõĵÄnativeµÄ²»¿ÉÀ©Õ¹µÄevent£¬±ÈÈçÎÞ·¨ÎªinputÔªËØÌí¼Óʼþ£¬Ö»ÄÜÔÚÆäÓµÓеÄʼþ£¨Èçonclick=handler£©ÉÏÀ©Õ¹Ó¦Óá£ÄÇôÄܲ»ÄÜ×öµ½×Ô¶¨ÒåµÄʼþÄ£ÄâЧ¹ûÄØ£¿´ð°¸Êǿ϶¨µÄ£¬Ò²¾ÍÊDZ¾ÎĵÄÖ÷Ìâ¡£
¡¡¡¡Ê×ÏÈŪÃ÷°×Ò»ÏÂʼþµÄÒâͼ¡ª¡ª¿ÉÒÔÔÚ·¢ÉúÒ»¼þʵÄʱºòÖ´ÐжîÍâµÄ´úÂ룬Èçdocument.attachEvent('onclick', function(){alert('u click document')})£¬µ±µã»÷Ò³ÃæÊ±£¨Ê¼þ·¢ÉúÁË£©£¬¾Í»áÖ´ÐÐÎÒÃÇΪÆä¹Ò½ÓµÄÆäËü´úÂ루jsÖÐÒÔfunctionΪÓï¾ä¼¯ºÏ£¬ÒÔϳÆÎªfunction£©£¬µ±È»ÎÒÃÇ¿ÉÒÔÔÚÒ»¸öʼþÉϹҽÓÈÎÒâ¶àµÄfunction£¬ÕâÑù¾ÍʵÏÖÁËÒ»ÖÖÁé»îµÄ¿ÉÀ©Õ¹±à³Ì½Ó¿Ú¡£ÊÔÏëÈç¹û¿ÉÒÔÏñÔÚÔªËØÊ¼þÀ©Õ¹Ó¦ÓÃÒ»Ñù¿ÉÒÔÔÚÈÎÒâ¶ÔÏóµÄÈÎÒâ·½·¨ÉÏÀ©Õ¹£¬ÄǶÔÓÚjs±à³ÌÀ´½²¾Í¸ü¼ÓÁé»îÁË¡£ÏÈ¿´Ò»¸öÀý×Ó£¬Æ½Ê±ÎÒÃǰÑÏà¶Ô¶ÔÁ¢µÄÒ»¸ö¹¦ÄÜÃüÃûΪһ¸öfunction£¬²¢ÔÚÐèÒªµÄµØ·½£¨Í¨³£ÊÇÁíÒ»¸öfunction£©µ÷ÓÃÒÔʵÏÖ´úÂ븴Óãº
function F(){
    this.method = function(){
        alert('f.method is called')
        g();
    }
}
function g(){
    alert(123)
}
var f = new F();
f.method()


ÎÒÃǰÑf.methodÖÐÖ±½Óµ÷ÓÃg¸ÄдһÏ£¬·â×°µ½Ò»¸öEvent¶ÔÏóÖдﵽһÑùµÄЧ¹û£¬´úÂëÈçÏ£º
var Event = {
    __list:[],
    observe:function(obj, ev, fun){
        this.__list.push({o:obj, e:ev, f:fun})
    },
    occor:function(obj, method){
        var arr = []
        for(var i=0; i<this.__list.length; i++){
            if(this.__list[i].o==obj && this.__list[i].e==method) arr.push(this.__list[i]);
        }
        for(var i=0; i<arr.length; i++){
            arr[i].f();
        }
    }
}

function F(){
    this.method = function(){
        alert('f.method is called')
        Event.occor(this, 'method');
    }
}

var f = new F();
Event.observe(f, 'method', function(){alert(123)})
f.method()ÕâÑùÕ§¿´ÉÏÈ¥ºÃÏñ·ÑÁË¡°Ì«¶à¡±¹¦·ò£¬µ«È´°Ñ¡°ÔÚfÖе÷ÓÃgµÄд·¨¡±¸üͨÓû¯ÁË£¬Èç¹ûÒªÔÚfÖе÷ÓÃhÔòÖ»ÐèÒª¶àЩһÐÐEvent.occor(this, 'methodName')£¬Ð´µ½ÕâÀïÄã¿Ï¶¨Ò²×¢Òâµ½methodNameµÄд·¨ºÍ×ʼµÄд·¨ÊÇÒ»ÑùµÄ£¬¶¼ÊÇÓ²±àµÄ²»¾ßÁé»îÐÔ£¬Èç¹ûÔÚÿ¸öÀàµÄ·½·¨Öж¼Ð´ÈëEvent.occor(this, 'method')¾ÍÌ«²»ÑŹÛÁË£¬Ò²±³ÀëÁËÎÒÃǵijõÖÔ£¬¶¯Ì¬ÐÞ¸ÄÒ»ÏÂmethod°ÑËü¼Óµ½×îºóÒ»ÐоÍokÁË£¬ÏÂÒ»²½¾ÍÊǽâ¾öËü£¬¸Ä½ø´úÂëÈçÏ£º

var Event = {
    __list:[],
    observe:function(obj, ev, fun){
        this.__list.push({o:obj, e:ev, f:fun})
    },
    occor:function(obj, method){
        var arr = []
        for(var i=0; i<this.__list.length; i++){
            if(this.__list[i].o==obj && this.__list[i].e==method) arr.push(this.__list[i]);
        }
        for(var i=0; i<arr.length; i++){
            arr[i].f();
        }
    },
    inject:function(obj){
        for(var p in obj){
            obj[p] = new Function(obj[p].toString().replace('function(){', '').replace('}', 'Event.occor(this,p)'))
        }
    }
}

function F(){
    this.method = function(){
        alert('f.method is called')
    }
}

var f = new F();
Event.inject(f);
Event.observe(f, 'method', function(){alert(123)})
f.method()ÎÒÃǰÑÏÔʾµÄÔÚ±»µ÷Ó÷½·¨ÌåÄÚµ÷ÓÃEvent.occor¸Äдµ½Event.injectÖС£µ½´ËÎÒÃǾͼòµ¥£¨»¹ÓÐһЩ°²È«´úÂëûÓд¦Àí£¬ÈçûÓÐÅжÏobj[p]ÊÇ·ñÐèÒª±»¸Äд¡¢Ã»ÓвâÊÔЧÂÊÎÊÌ⣬ûÓд¦Àí¸ü¶àÌí¼ÓEvent.occorʱµÄÂß¼­Åжϣ¬ÏÂÒ»²½×¼±¸°ÑËüʵÏÖΪһ¸öObserveable¶ÔÏ󣬾͸ü¼ÓÁé»îÁË£©µÄÍê³ÉÁË×Ô¶¨Òåʼþ¡£