jQuery2.0.3源码学习---继承方法

  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()。随后源码又定义了一些变量,代码的注释里已经写明了变量的含义。接着又开始判断目标值是否为布尔值,如果为布尔值,就表明需要进行拷贝,把目标值换为第二个参数。

  至于深拷贝与浅拷贝  明天在学习下。

 

原文地址:https://www.cnblogs.com/OnePieceKing/p/11279861.html

时间: 2024-11-10 17:24:04

jQuery2.0.3源码学习---继承方法的相关文章

一起学习jQuery2.0.3源码—1.开篇

write less,do more jQuery告诉我们:牛逼的代码不仅精简而且高效! 2006年1月由美国人John Resig在纽约的barcamp发布了jQuery,吸引了来自世界各地众多JavaScript高手加入,由Dave Methvin率领团队进行开发.如今,jQuery已经成为最流行的JavaScript框架,在世界前10000个访问最多的网站中,有超过55%在使用jQuery. jQuery 版本:截止2013年6月的版本是2.0.3和1.10.2.其中,jQuery1.10

JDK1.8源码学习-String-hashCode方法为什么选择数字31作为乘子

1. 背景 某天,我在写代码的时候,无意中点开了 String hashCode 方法.然后大致看了一下 hashCode 的实现,发现并不是很复杂.但是我从源码中发现了一个奇怪的数字,也就是本文的主角31.这个数字居然不是用常量声明的,所以没法从字面意思上推断这个数字的用途.后来带着疑问和好奇心,到网上去找资料查询一下.在看完资料后,默默的感叹了一句,原来是这样啊.那么到底是哪样呢?在接下来章节里,请大家带着好奇心和我揭开数字31的用途之谜. 2. 选择数字31的原因 在详细说明 String

jQuery2.0.3源码

概览 整体结构 (function (){ (21 , 94) 定义了一些变量和函数 jQuery=function(); (96 , 293) 给jQuery对象添加一些方法和属性; (285 , 347) extend:jQuery扩展方法; (349 , 817) jQuery.extend : 扩展一些工具方法; (877 , 2856 ) Sizzle : 复杂选择器的实现; (2880, 3042 ) Callbacks : 回调对象:函数的统一管理 (3043, 3183 ) De

wordpress4.0.1源码学习和摘录--函数

1.根据类型获取当前时间 function current_time( $type, $gmt = 0 ) { switch ( $type ) { case 'mysql': return ( $gmt ) ? gmdate( 'Y-m-d H:i:s' ) : gmdate( 'Y-m-d H:i:s', ( time() + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ) ) ); case 'timestamp': return ( $g

wordpress4.0.1源码学习和摘录--项目设置

1.静态变量日期 define( 'MINUTE_IN_SECONDS', 60 ); define( 'HOUR_IN_SECONDS', 60 * MINUTE_IN_SECONDS ); define( 'DAY_IN_SECONDS', 24 * HOUR_IN_SECONDS ); define( 'WEEK_IN_SECONDS', 7 * DAY_IN_SECONDS ); define( 'YEAR_IN_SECONDS', 365 * DAY_IN_SECONDS ); 2.禁

AOSP Android5.0 lollipop 源码同步更新方法

repo init -u https://android.googlesource.com/platform/manifest -b android-5.0.0_r2 repo sync -j16 或者 repo init -u https://android.googlesource.com/platform/manifest -b lollipop-release repo sync -j16

[Android FrameWork 6.0源码学习] View的重绘过程之WindowManager的addView方法

博客首页:http://www.cnblogs.com/kezhuang/p/ 关于Activity的contentView的构建过程,我在我的博客中已经分析过了,不了解的可以去看一下 <[Android FrameWork 6.0源码学习] Window窗口类分析> 本章博客是接着上边那篇博客分析,目的是为了引出分析ViewRootImpl这个类.现在只是分析完了Window和ActivityThread的调用过程 从ActivityThread到WindowManager再到ViewRoo

jquery源码学习

jQuery 源码学习是对js的能力提升很有帮助的一个方法,废话不说,我们来开始学习啦 我们学习的源码是jquery-2.0.3已经不支持IE6,7,8了,因为可以少学很多hack和兼容的方法. jquery-2.0.3的代码结构如下 首先最外层为一个闭包, 代码执行的最后一句为window.$ = window.jquery = jquery 让闭包中的变量暴露倒全局中. 传参传入window是为了便于压缩 传入undefined是为了undifined被修改,他是window的属性,可以被修

tomcat源码学习(2)&#160;&#160;关于apache&#160;digest

好久不写博文,罪过罪过.因为最近公司比较忙加上琐事有点多,所以隔了好久才来更新博文. apache digest本来是struts2框架中来加载xml文件并实例化对象的一个jar包,后来使用的越来越多. 我们都知道tomcat的conf文件夹下有一个server.xml配置文件,我们经常会其中的来进行配置以来运行一个java web项目,也经常修改中的port属性以来实现修改tomcat监听的端口.其实每个标签基本上都对应着一个对象,那tomcat是如何将这些对象实例化到java 虚拟机的运行内