您的位置:首页 > Web前端 > JQuery

jQuery源码学习---插件接口的设计

2016-09-14 10:37 344 查看
如果jQuery没有插件接口的设计,那么他就像一个光杆司令没有士兵,就是没有手下,只有自己一个封闭的城堡。因此jQuery城堡需要设计一个大门--插件接口,从而打开大门开始招兵买马。当然jQuery除了获得“开发者社区”的

大力支持外,也有很多公司纷纷对它投出了橄榄枝,这也是它成功的关键。

基于插件接口设计的好处也是颇多的,其中一个最重要的好处是把功能从主体框架中剥离出去,降低了框架的复杂度。接口的设计好比电脑上的配件如:CPU、内存、硬盘都是作为独立的模块分离出去了,但是主板提供模板的接口,例如支持串口的硬盘,我只需要这个硬盘的接口能够插上,甭管是500G还是1000G的硬盘的容量,都能使用。所以在软件设计中插件接口的提供把独立的功能与框架以一种很宽松的方式松耦合。

从之前的分析中我们可以知道jQuery对象的原理,所以一般来说,jQuery插件的开发分为两种:

(1)一种是挂在jQuery命名空间下的全局函数,也可成为静态方法。

(2)另外一种是jQuery对象级别的方法,即挂在jQuery原型下的方法,这样通过选择器获取的jQuery对象实例也能共享该方法。

提供的接口:

$.extend(target, [object1], [objectN])
接口的使用:

jQuery.extend({
data:function(){},
removeData:function(){}
})

jQuery.fn.extend({
data:function(){},
removeData:function(){}
})


jQuery的主体框架就是之前提到的那样,通过工厂模式返回一个内部的init构造器生成的对象。但是根据一般设计者的习惯,如果要为jQuery添加静态方法或者实例方法从封装的角度讲是应该提供一个统一的接口才符合设计的。

jQuery支持自己扩展属性,这个对外提供了一个接口,jQuery.fn.extend()来对对象增加方法。

jQuery.extend调用的时候上下文指向的是jQuery构造器

jQuery.fn.extend调用的时候上下文指向的是jQuery构造器的实例对象了

通过extend()函数可以方便快速的扩展功能,不会破坏jQuery原型结构,

jQuery.extend = jQuery.fn.extend() = function(){};这个是连等,也就是两个指向同一个函数,怎么实现不同的功能呢?这就是this的力量了!

fn与jQuery其实是2个不同的对象,在之前有讲解:jQuery.extend调用的时候,this是指向jQuery对象的,所以这里扩展在jQuery上。而jQuery.fn.extend调用的时候,this指向fn对象,jQuery.fn和jQuery.prototype指向同一个对象,扩展fn就是扩展jQuery.prototype原型对象。这里增加的是原型方法,也就是对象方法了。所以jQuery的API中提供了2个扩展函数。
jQuery的extend代码实现的比较长,我们简单说一下重点:

jQuery.extend = jQuery.fn.extend = function(){
var options,src,copy,
target = arguments[0]||{},
i=1,
length = arguments.length;

if(i===length){
target = this;
i--;
}

for(;i<length;i++){
if((options = arguments[i])!=null){
for(name in options){
target[name] = options[name];
}

}
}

return target;
}
其中最重要的一段target= this,通过调用的方式我们能确定当前的this指向,所以这个时候就能确定target了。最后就很简单了,通过for循环遍历把数据附加到这个target上了。当然在这个附加的过程中我们还可以做数据过滤和深层拷贝等一系列操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐