jQuery为开发插件提供了两个方法,分别是:jquery
1. jQuery.fn.extend():给jQuery对象提供方法。函数
2. jQuery.extend():为扩展jQuery类自己添加方法。oop
先看源码是怎么实现的,截取自JQuery-1.11.0,不想看,能够直接越过。。this
源码截取出来了,中文地方为我加的说明spa
jQuery.extend = jQuery.fn.extend = function() { var src, copyIsArray, copy, name, options, clone, //target初始化为取第一个参数 OR {}, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false; //这里的判断target是否为boolean,引伸extend方法的另种形式 extend(boolean,dest,src1,src2,src3...)。 // Handle a deep copy situation if ( typeof target === "boolean" ) { deep = target; // skip the boolean and the target 看不懂么?越过第一个boolean把target设置为第二个参数,i++... target = arguments[ i ] || {}; i++; } // Handle case when target is a string or something (possible in deep copy) //target类型判断,类型不对,就初始化为{} if ( typeof target !== "object" && !jQuery.isFunction(target) ) { target = {}; } // extend jQuery itself if only one argument is passed //就里引伸为另外一个方法extend(src),只有一个参数。 if ( i === length ) { target = this; i--; } for ( ; i < length; i++ ) { // Only deal with non-null/undefined values if ( (options = arguments[ i ]) != null ) { // Extend the base object for ( name in options ) { src = target[ name ]; copy = options[ name ]; // Prevent never-ending loop if ( target === copy ) { continue; } // Recurse if we're merging plain objects or arrays if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { if ( copyIsArray ) { copyIsArray = false; clone = src && jQuery.isArray(src) ? src : []; } else { clone = src && jQuery.isPlainObject(src) ? src : {}; } // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); // Don't bring in undefined values } else if ( copy !== undefined ) { target[ name ] = copy; } } } } // Return the modified object return target; };
从源码中能够看出插件
1.jQuery.extend和jQuery.fn.extend是同一个方法,可是具体的做用却不同。由于在调用jQuery.extend 和jQuery.fn.extend 函数时,函数内部this是不一样的,jQuery.extend()内this固然是jQuery,而jQuery.fn.extend固然是jQuery.fn,这样jQuery.extend()为扩展jQuery类自己.为类添加新的方法。jQuery.fn.extend()是给jQuery对象添加方法。 code
2. extend(src):将src对象的属性和方法逐一复制给jQuery或jQuery对象 对象
例如:继承
$.extend({ hello:function(){alert('hello Josean');} }); //就是将hello方法合并到jquery的全局对象中
同理ip
$.fn.extend({ hello:function(){alert();} }); //就是将hello方法合并到jquery的实例对象中。
3. extend(dest, src1, src2, src3..srcN):将src1, src2…对象的属性和方法逐一复制给dest
对象。需注意的是,在复制的过程当中,排在后面的参数(对象)将会覆盖排在前面的参数和属性的方法。
dest对象数据就会生改变,若是不想改dest刚传‘{}’
例如:
var result=$.extend({},{name:"test1",age:21},{name:"test2",sex:"man"}) //结果: result={name:"test2",age:21,sex:"man"}
4. extend(boolean, dest, src1,src2…):jQuery的extend方法提供了“深层拷贝”的功能,若是传入第一个参数为boolean型变量,则该变量为深层拷贝的标志,第二个参数为extend方法的目标对象,其他参数为须要进行继承的“父类”。若是第一个参数的值为true(深度拷贝),而且dest和src元素都包括相同名称的对象属性,则对该对象的属性和方法再进行一次复制。
var result=$.extend( , {}, { name: John, location: {city: Beijing,county:China} }, { last: Resig, location: {state:MA ,county:USA} } ); //结果 result={name:"John",last:"Resig", location:{city:"Beijing",state:"MA",county:"USA"}}
后面都是以$.extend为例子,你们能够试试$.fn.extend试一下哈
文章属于自已原创,转载请说明。
参考了百度 ^_^