jQuery的extend方法

jQuery 中一个重要的函数便是 extend,可以用它进行浅拷贝和深拷贝。

用它来对本身 jQuery 的属性和方法进行扩张,又可以对原型的属性和方法进行扩展。

jQuery.extend(target);// jQuery 的扩展
jQuery.extend(target, obj1, obj2,..);//浅拷贝 
jQuery.extend(false, target, obj1, obj2,..);//浅拷贝 
jQuery.extend(true, target, obj1, obj2,..);//深拷贝 

下面是jQuery.3.3.1.js 中的源码

jQuery.extend = jQuery.fn.extend = function() {//fn指的是prototype
	var options, name, src, copy, copyIsArray, clone,
		target = arguments[ 0 ] || {},
           //如果第一个值为null,那么target已经为{};他是一个对象
		i = 1,
		length = arguments.length,
		deep = false;

	// Handle a deep copy situation
	if ( typeof target === "boolean" ) {//判断是否是布尔值,方便判断是浅拷贝或者深拷贝
		deep = target;

		// Skip the boolean and the target
		target = arguments[ i ] || {};//target是第二个参数;
		i++;
	}

	 // 处理 target 是字符串或奇怪的情况,isFunction(target) 可以判断 target 是否为函数
	if ( typeof target !== "object" && !isFunction( target ) ) {
		target = {};
	}

	// Extend jQuery itself if only one argument is passed,判断是否 jQuery 的扩展
	if ( i === length ) {
         // this 做一个标记,可以指向 jQuery,也可以指向 jQuery.fn
		target = this;
		i--;//0
	}

	for ( ; i < length; i++ ) {

		// null/undefined 判断
		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;
				}

				// 是数组或者对象(非函数,可以是null,)进入循环
				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
					( copyIsArray = Array.isArray( copy ) ) ) ) {

					if ( copyIsArray ) {
						copyIsArray = false;
						clone = src && Array.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 ) {  
                           //这一句。不能拷贝undefined,可以拷贝undefined
                             
					target[ name ] = copy;
				}
			}
		}
	}

	// Return the modified object
	return target;
};

这个方法可以拷贝null,函数,数组,但是拷贝不了undefined。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值