dess中,一个简单的多路委托的实现

var SDelegate = function(f, b, c) {
    if (b) {
        this.asFunction_ = function() {
            return f.apply(b, arguments);
        }
    } else {
        this.asFunction_ = function() {
            return f.apply(this, arguments);
        }
    }
    this.method_ = f;
    this.binding_ = b;
    this.continus = c;
}
SDelegate.composite = function(d) {
    if (d.continus) {
        var con = d.continus.composited_ = SDelegate.composite(d.continus);
        var method = d.asFunction_;
        return function() {
            con.apply(this, arguments);
            return method.apply(this, arguments);
        }
    } else {
        return d.asFunction_;
    }
}
SDelegate.prototype.call = function() {
    if (!this.composited_) this.composited_ = SDelegate.composite(this);
    return this.composited_.apply(arguments[0], Array.prototype.slice.call(arguments, 1));
}
SDelegate.prototype.remove = function() {
    var removeP = function(parent, item, test, data) {
        if (!item) return;
        parent.composited_ = item.composited_ = null;
        if (test(item, data)) {
            parent.continus = item.continus;
            removeP(parent, item.continus, test, data);
        } else {
            removeP(item, item.continus, test, data);
        }
    };
    return function(test, data) {
        var p = this;
        if (test(this, data)) {
            p = this.continus;
        }
        removeP(p, p.continus, test, data);
        p.composited_ = null;
        return p;
    }
}();
SDelegate.prototype.append = function(f, b) {
    return new SDelegate(f, b, this);
}

这个SDelegate用起来可能会比较诡异,比如很多操作都要重新赋值。Dess中,SDelegate主要用于一些特定场合,如DOM事件派发。

posted @ 2010-07-19 17:13  infinte  阅读(287)  评论(0编辑  收藏  举报