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的主体框架就是之前提到的那样,通过工厂模式返回一个内部的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上了。当然在这个附加的过程中我们还可以做数据过滤和深层拷贝等一系列操作。
大力支持外,也有很多公司纷纷对它投出了橄榄枝,这也是它成功的关键。
基于插件接口设计的好处也是颇多的,其中一个最重要的好处是把功能从主体框架中剥离出去,降低了框架的复杂度。接口的设计好比电脑上的配件如: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上了。当然在这个附加的过程中我们还可以做数据过滤和深层拷贝等一系列操作。
相关文章推荐
- jquery源码学习之 设计结构
- jQuery插件xmlDOM源码学习
- Jquery 源码分析一: 整体架构、链式调用、插件接口
- jQuery框架学习第十一天:实战jQuery表单验证及jQuery自动完成提示插件
- jQuery1.3.2 源码学习 -1 $ 是什么?jQuery 又是什么?
- 百灵报表(BIRT)接口学习:设计report design
- jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
- jQuery inputMask字母数字下划线掩码插件!!含API帮助、源码、示例
- jQuery formValidator表单验证插件开源了!!含API帮助、源码、示例
- jQuery formValidator表单验证插件开源了!!含API帮助、源码、示例
- 基于GoogleMap,Mapabc,51ditu,VirtualEarth,YahooMap Api接口的Jquery插件的通用实现(含源代码下载)
- jQuery 中插件的使用与开发---附全部源码(含 jQuery1.3.2 for VS 的智能提示js文件)
- 设计模式学习笔记4:对接口进行包装的Adapter
- jQuery 中插件的使用与开发---附全部源码(含 jQuery1.3.2 for VS 的智能提示js文件)
- jQuery 中插件的使用与开发---附全部源码(含 jQuery1.3.2 for VS 的智能提示js文件)
- jQuery1.3.2 源码学习 -2 两个重要的正则表达式
- jQuery DateTimeMask日期掩码插件发布了!!含API帮助、源码、示例
- jQuery formValidator表单验证插件开源了!!含API帮助、源码、示例
- 学习JQuery写的第一个插件_屏幕滚动
- 从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件