dojo.connect的实现方法

本文深入探讨了Dojo库中connect方法的工作原理,解释了如何在非DOM对象上实现事件绑定,并揭示了其背后的机制。通过解析源代码,我们发现connect实际上通过修改原函数来实现事件触发,而不是直接注册事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

dojo.connect(object1, 'method1', object2, 'method2');

有了这段代码以后,每当执行object1.metohd1();以后,都会立即执行object2.method2(). 这就像在object1上注册了一个type名为method1的event. event会触发object2.method2.

object1并不一定是一个dom node, dojo.connect是怎么做到对object1注册event?

一切都是假象。

dojo.connect并没有像dom event一样注册一个event。它其实是将原函数做了修改。下面一小段code说明了dojo.connect中到底对原函数做了什么。

// 伪代码
dojo.connect(object1, methodName1, object2,methodName2) {
    var f = object1[methodName1];
    var attach = dojo.hitch(object2,methodName2);
    var listeners = f.listeners||[];
    listeners.push(attach);
    
    var d = function() {
        var ap = Array.prototype;
        var c = arguments.callee;
        var l = c.listeners;
        var t = c.target;

        var r = t.apply(this, arguments);
        for (i in l) {
            if (! (i in ap)) {
                l[i].apply(this,arguments);
            }
        }
        return r;
    };
    d.target=f;
    d.listeners = listeners;

    object1[methodName1]=d;
}

从上面代码看出,dojo.connect创建一个新的函数,在此函数中,先执行原函数,再依次执行listener中的函数。 把这个函数重新assign给自己, 为了能保存住原函数和listener,dojo.connect为新创建的函数增加了target和listeners两个属性。

dojo.connect的漏洞在于,一旦对原函数重新复制,listener和修改后的函数就完全丢掉了。

转载于:https://my.oschina.net/xpbug/blog/71941

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值