jquery3.0源码解读(二)Extend
2016-09-11 19:45
190 查看
前置知识
arguments重载
深拷贝/浅拷贝
代码概况
上一节我们打开了/src/core.js文件,但是仅仅看了它的jQuery对象的赋值。这节我们来仔细分析core.js文件中的一个重要内容——extend。如果,简单翻阅过jquery源码的话,你会发现源码中,也有多处调用了extend函数。所以,这个Extend不光为外部提供调用,jquery内部同样使用,可以说是一个基础函数。重要性可见一斑。
首先,通过jQuery.extend = jQuery.fn.extend,我们得知,jQuery.extend和的代码实现是相同的。关键在于方法的重载(jquery中使用了大量的重载)。
功能说明
在阅读源码之前,我们先翻阅api手册了解其主要的几种功能用法,主要有如下几种:jQuery.extend( target [, object1 ] [, objectN ] )
合并object1, objectN到target对象
jQuery.extend( [deep ], target, object1 [, objectN ] )
深度复制合并对象,第一个参数是boolean类型的true时,将object1, objectN深度复制后合并到target
jQuery.extend(object)
合并object对象到jQuery对象中
jQuery.fn.extend(object)
合并object对象到jQuery.prototype(也就是jQuery.fn)对象中
这里解释下3和4的区别。一种是对jquery实例对象进行扩展,一种是对原型对象进行扩展。如果明白js原型链的话就很容易理解,后者的扩展会在所有jquery对象中体现,而前者不会。
源码分析
接下来,看一下源码: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[ i ] || {}; i++; } if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { target = {}; } if ( i === length ) { 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; } 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 : {}; } target[ name ] = jQuery.extend( deep, clone, copy ); } else if ( copy !== undefined ) { target[ name ] = copy; } } } } return target; };
第一步:target被赋值成第一个参数,并判断是不是boolean值,如果是,deep赋值为第一个参数,target赋值为第二个参数;
第二步:接着判断target,是不是一个字符串,或者其他,是的话target就被赋值为空对象,主要用于容错;
第三步:判断剩余参数长度(除去deep)是不是等于1,是的话,target就被赋值为this。如果是jQuery.extend调用,this就是jQuery,如果是jQuery.fn.extend,this就是jQuery.fn;
第四步:把i(用于标记第一个object的index)后面的对象参数扩展进target即可,其中注意判断深/浅拷贝就行。
至于如何扩展,逻辑很简单,简单实现如下:
function(target, options) { for (name in options) { target[name] = options[name]; } return target; }
这里就不累述了。
相关文章推荐
- jquery3.0源码解读(一)Init
- jQuery.extend()源码解读
- jQuery源码解读之extend()与工具方法、实例方法详解
- jQuery.extend()源码解读
- .Ext源码解读之一 -- extend的实现
- jQuery源码解读2:.extend()函数
- $.extend()和_.extend()源码解读
- jquery3.0源码解读(三)Selector
- JQuery3.1.1源码解读(十二)【event-extend】
- Flink源码解读--FlinkKafkaConsumer09
- Java HashMap 核心源码解读
- Tomcat源码解读系列(四)——Tomcat类加载机制概述
- .NET框架源码解读之准备CLR源码阅读环境
- Java HashMap 核心源码解读
- java.io.BufferedWriter API 以及源码解读
- CppUnit源码解读20120325
- 第6课:Spark Streaming源码解读之Job动态生成和深度思考
- Spring 源码分析-整体架构解读
- 【源码解读】Retrofit网络请求过程源码解析
- Java 集合深入理解(16):HashMap 主要特点和关键方法源码解读