Posted in Javascript onJuly 20, 2010
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事件派发。
dess中一个简单的多路委托的实现
声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
Reply on: @reply_date@
@reply_contents@