根据一般设计习惯,如果要为jQuery或者jQuery.prototype添加函数或方法,可以直接通过点语法实现,或者在jQuery.prototype对象结构中增加一个属性即可。但是,如果分析jQuery框架的源代码,你会发现它是通过extend()函数来实现功能扩展的。例如,下面两段代码都是jQuery框架通过extend()函数来扩展功能的。
广州网站建设,网站建设,广州网页设计,广州网站设计
- jQuery.extend({ //扩展工具函数
- noConflict: function( deep ) {},
- isFunction: function( obj ) {},
- isArray: function( obj ) {},
- isXMLDoc: function( elem ) {},
- globalEval: function( data ) {}
- });
或者
- jQuery.fn.extend({ //扩展jQuery对象方法
- show: function(speed,callback){},
- hide: function(speed,callback){},
- toggle: function( fn, fn2 ){},
- fadeTo: function(speed,to,callback){},
- animate: function( prop, speed, easing, callback ) {},
- stop: function(clearQueue, gotoEnd){}
- });
这样做的好处是什么呢?
extend()函数能够方便用户快速扩展jQuery框架的功能,但是不会破坏jQuery框架的原型结构,从而避免后期人工手动添加工具函数或者方法时破坏jQuery框架的单纯性,同时也方便管理。如果不需要某个插件,只需要简单地删除即可,而不需要在jQuery框架源代码中去筛选和删除。
extend()函数的功能实现起来也很简单,它只是把指定对象的方法复制给jQuery对象或者jQuery.prototype对象。例如,在下面的示例中,我们为jQuery类和原型定义了一个扩展功能的函数extend(),该函数的功能很简单,它能够把指定参数对象包含的所有属性复制给jQuery或者jQuery.prototype对象,这样就可以在应用中随时调用它,并动态扩展jQuery对象的方法。
广州网站建设,网站建设,广州网页设计,广州网站设计
- <script language="javascript" type="text/javascript">
- var $ = jQuery = function(selector, context ){
- return new jQuery.fn.init(selector, context );
- }
- jQueryjQuery.fn = jQuery.prototype ={
- init : function(selector, context){
- }
- }
- jQueryjQuery.fn.init.prototype = jQuery.fn;
- //jQuery功能扩展函数
- jQueryjQuery.extend = jQuery.fn.extend = function(obj) {
- for (var prop in obj) {
- this[prop] = obj[prop];
- }
- return this;
- }
- //扩展jQuery对象方法
- jQuery.fn.extend({
- test : function(){
- alert("测试扩展功能");
- }
- })
- //测试代码
- $("div").test();
- </script>
在上面的示例中,先定义了一个功能扩展函数extend(),然后为jQuery.fn原型对象调用extend()函数,为其添加一个测试方法test()。这样就可以在实践中应用,如$("div").test()。
jQuery框架定义的extend()函数的功能要强大很多,它不仅能够完成基本的功能扩展,还可以实现对象合并等功能,详细代码和解释如下所示。
- jQueryjQuery.extend = jQuery.fn.extend = function() {
- // 定义复制操作的目标对象
- var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
- //获取是否深度复制处理
- if ( typeof target === "boolean" ) {
- deep = target;
- target = arguments[1] || {};
- // 跳出布尔值和目标对象
- i = 2;
- }
- // 如果第一个参数是字符串,则设置为空对象
- if ( typeof target !== "object" && !jQuery.isFunction(target) )
- target = {};
- //如果只有一个参数,表示把参数对象的方法复制给当前对象,则设置target为this
- if ( length == i ) {
- target = this;
- --i;
- }
- for ( ; i < length; i++ ) //遍历参数
- // 若参数值不为null,则进行处理
- if ( (options = arguments[ i ]) != null )
- // Extend the base object
- for ( var name in options ) { //遍历参数对象
- var src = target[ name ], copy = options[ name ];
- // 防止死循环访问
- if ( target === copy )
- continue;
- // 递归运算
- if ( deep && copy && typeof copy === "object" && !copy.nodeType )
- target[ name ] = jQuery.extend( deep,
- // 不要复制原对象
- src || ( copy.length != null ? [ ] : { } )
- , copy );
- // 不要传递未定义的值
- else if ( copy !== undefined )
- target[ name ] = copy;
- }
- // 返回修改后的对象
- return target;
- };
广州网站建设,网站建设,广州网页设计,广州网站设计



