标签:his undefined prototype jquer isarray efi argument 结束 源码
jQuery中的extend()方法主要有三种用法:
// 扩展插件 调用方法:$.a() $.extend({ a : function{ alert(1) } }) // 合并对象到第一个 $.extend(a,{name:‘nick‘},{age:‘30‘}) //拷贝 var a = {}; var b = {nage: ‘nick‘} $.extend(a, b) //浅拷贝 $.extend(true,a, b) //浅拷贝
其源码部分如下所示:
jQuery.extend = jQuery.fn.extend = function() { var options, name, src, copy, copyIsArray, clone, target = arguments[0] || {}, //参数列表的第一个 即目标值 i = 1, length = arguments.length, deep = false; //深拷贝与浅拷贝 默认时浅拷贝 if ( typeof target === "boolean" ) { //判断是否拷贝,更换目标值 deep = target; target = arguments[1] || {}; i = 2; } if ( typeof target !== "object" && !jQuery.isFunction(target) ) { //判断参数是否正确 target = {}; } if ( length === i ) { //参数只有一个对象,表明插件调用 target = this; --i; } for ( ; i < length; i++ ) { if ( (options = arguments[ i ]) != null ) { //判断有意义 for ( name in options ) { src = target[ name ]; copy = options[ name ]; if ( target === copy ) { continue; //防止循环引用 如果target和copy的值相等,就会导致一致循环下去 } if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { //deep为真 深拷贝 if ( copyIsArray ) { //递归结束 copyIsArray = false; clone = src && jQuery.isArray(src) ? src : []; } else { clone = src && jQuery.isPlainObject(src) ? src : {}; } target[ name ] = jQuery.extend( deep, clone, copy ); //递归调用 } else if ( copy !== undefined ) { //浅拷贝 target[ name ] = copy; } } } } return target; };
首先 ,jQuery.extend = jQuery.fn.extend = function(){...},jQuery是一个函数,把一个方法添加到函数下面,叫做扩展静态方法,jQuery.fn是jQuery.prototyped的一个引用,也就是jQuery的原型,把方法添加到原型下面叫做扩展实例方法。这样在调用扩展静态方法时直接$.fn()就可以了,而调用实例方法需要$().fn()。随后源码又定义了一些变量,代码的注释里已经写明了变量的含义。接着又开始判断目标值是否为布尔值,如果为布尔值,就表明需要进行拷贝,把目标值换为第二个参数。
至于深拷贝与浅拷贝 明天在学习下。
标签:his undefined prototype jquer isarray efi argument 结束 源码
原文地址:https://www.cnblogs.com/OnePieceKing/p/11279861.html