why?
chain 是针对对象的,chain链条上的所有方法都是这个对象的方法
一个没有用chain技巧的
var dom = document.getElementById('dom'); setStyle(dom,'color','green'); show(dom);
$('dom').setStyle('color','green').show();
chain技巧,让相关操作,紧密地组织在一起,拥有高内聚的特点。故更优雅、易读、易理解
how?
在类的prototype中,每一个方法的结束,返回this,这样,这个类的方法就可以chainable
what?
jquery 中 $ 的简单模拟实现
(function(){ function _$(els){ this.elements = []; for(var i=0,len=els.length;i<len;++i){ var element = els[i]; if(typeof element === 'string'){ element = document.getElementById(element); } this.elements.push(element); } } window.$ = function(){ return new _$(arguments); } _$.prototype = { each : function(fn){ for(var i=0,len=this.elements.length;i<len;i++){ fn.call(this,this.elements[i]); } }, setStyle : function(prop,val){ this.each(function(el){ el.style[prop] = val; }); return this; }, show : function(){ var that = this; this.each(function(el){ that.setStyle('display','block'); }); return this; }, addEvent: function(type, fn) { var add = function(el) { if (window.addEventListener) { el.addEventListener(type, fn, false); } else if (window.attachEvent) { el.attachEvent('on'+type, fn); } }; this.each(function(el) { add(el); }); return this; } }; window.$ = function(){ return new _$(arguments); } })();
$(window).addEvent('load',function(){ $('test-1','test-2').show(). setStyle('color','red'). addEvent('click',function(e){ $(this).setStyle('color','green'); }); });
chain 的特点是,所有函数都返回this,如果希望放回其他对象,该怎么办呢?
为了不改变chain在各个函数中的一致性,我们还是让所有函数放回this,针对需要返回其他对象的函数,我们通过会掉函数来实现。
如:
getName : function(name,callback){ var name = this.name; callback.call(this,name); return this; }
我们可以再callback中处理数据,而后还是返回this