jquery源码分析之扩展函数 extend, $.extend

news/2024/7/10 22:56:20 标签: jquery, 扩展, function, object, null, c
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="htmledit_views">
color:initial; font-size:13px; vertical-align:baseline; color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; text-align:left; background-color:rgb(247,247,247)"> 声明:本文为 斯人原创࿰c;全部为作者一一分析得之࿰c;有不对的地方望赐教。
欢迎转载࿰c;转载请注明出处 。
本文地址: http://imsiren.com/archives/525

color:initial; font-size:13px; vertical-align:baseline; line-height:18px; color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; text-align:left; background-color:rgb(247,247,247)"> 好久没写class="tags" href="/tags/JQUERY.html" title=jquery>jquery源码的内容了..
color:initial; vertical-align:baseline">class="tags" href="/tags/JQUERY.html" title=jquery>jquery的发展有很大因素是因为它非常易于class="tags" href="/tags/KuoZhan.html" title=扩展>扩展,究其原因就得益于 extend函数
该函数是一个class="tags" href="/tags/KuoZhan.html" title=扩展>扩展函数…说是一个class="tags" href="/tags/KuoZhan.html" title=扩展>扩展函数,其实就是一个浅拷贝和深拷贝的函数而已.
该函数 确实很强大,而且写的很优雅..
先来看看用法,有三种用法.
color:initial; vertical-align:baseline">1、$.extend(dest,src1,src2,src3…);
color:initial; vertical-align:baseline">2、$.extend(src)
color:initial; vertical-align:baseline">3、$.extend(boolean,dest,src1,src2,src3…)
意思就是将 src1,src2,src3合并到dest对象中..
特别说一下第三种,第一个参数的意义就在于 是否对src1,src2等进行深copy.
那么什么是深copy呢?
var ret=$.extend(true,{},
{name:”siren”,about:{age:24,country:”beijing”}},
{from:”hebei”,birthday:{year:1988,month:02}}
);color:initial; vertical-align:baseline">
如果第一个值为true,那么就对src1,src2进行深copy.
这个时候ret返回值就是 ret={name:”siren”,about:{age:24,country:”beijing”},from:”hebei”,birthday:{year:1988,month:02}};
发现 连 about和birthday的属性都一起copy到了dest里面.这就是深copy.
那么看看源码

color:initial; font-size:13px; vertical-align:baseline; line-height:18px; color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; text-align:left; background-color:rgb(247,247,247)">

<code class="language-javascript">o.extend = o.fn.extend = class="tags" href="/tags/FUNCTION.html" title=function>function() {
        var J = arguments[0] || {},
        H = 1,
        I = arguments.length,
        E = false,
        G;
        if (typeof J === "boolean") {
            E = J;
            J = arguments[1] || {};
            H = 2
        }
        if (typeof J !== "class="tags" href="/tags/OBJECT.html" title=object>object" && !o.isFunction(J)) {
            J = {}
        }
        if (I == H) {
            J = this; --H
        }
        for (; H < I; H++) {
            if ((G = arguments[H]) != class="tags" href="/tags/NULL.html" title=null>null) {
                for (var F in G) {
                    var K = J[F],
                    L = G[F];
                    if (J === L) {
                        continue
                    }
                    if (E && L && typeof L === "class="tags" href="/tags/OBJECT.html" title=object>object" && !L.nodeType) {
                        J[F] = o.extend(E, K || (L.length != class="tags" href="/tags/NULL.html" title=null>null ? [] : {}), L)
                    } else {
                        if (L !== g) {
                            J[F] = L
                        }
                    }
                }
            }
        }
        return J
    };code>


color:initial; font-size:13px; vertical-align:baseline; line-height:18px; color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; text-align:left; background-color:rgb(247,247,247)"> color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:18px; text-align:left; background-color:rgb(247,247,247)">这是方法的定义部分.
color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:18px; text-align:left; background-color:rgb(247,247,247)" /> color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:18px; text-align:left; background-color:rgb(247,247,247)">我们逐行分析.
color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:18px; text-align:left; background-color:rgb(247,247,247)" /> color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:18px; text-align:left; background-color:rgb(247,247,247)">第2行 获取 extend传递进来的第一个参数..如果没有 初始化为一个对象.
color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:18px; text-align:left; background-color:rgb(247,247,247)" /> color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:18px; text-align:left; background-color:rgb(247,247,247)">4行获取参数的个数.
color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:18px; text-align:left; background-color:rgb(247,247,247)" /> color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:18px; text-align:left; background-color:rgb(247,247,247)">7行:如果第一个参数传递过来的是一个bool类型,这个时候用法就是我们前面提到的第三种.
color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:18px; text-align:left; background-color:rgb(247,247,247)" /> color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:18px; text-align:left; background-color:rgb(247,247,247)">12-14行:是一种规定,第一个参数要么是bool类型 要么是obj类型.当然在js里 obj类型也包括函数.
color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:18px; text-align:left; background-color:rgb(247,247,247)" /> color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:18px; text-align:left; background-color:rgb(247,247,247)">18-34行:进行复制.变量G是一个临时变量保存当前src的值.
color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:18px; text-align:left; background-color:rgb(247,247,247)" /> color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:18px; text-align:left; background-color:rgb(247,247,247)">比如执行 $.extend({},{a:10}); G就等于{a:10}
color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:18px; text-align:left; background-color:rgb(247,247,247)" /> color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:18px; text-align:left; background-color:rgb(247,247,247)">26-27行:如果进行深复制,src的属性也是一个对象并且不是一个element对象…这个时候再调用o.extend 递归进行复制.
color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:18px; text-align:left; background-color:rgb(247,247,247)" /> color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:18px; text-align:left; background-color:rgb(247,247,247)">否则
color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:18px; text-align:left; background-color:rgb(247,247,247)" /> color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:18px; text-align:left; background-color:rgb(247,247,247)">29-31行:L!==g. g是哪儿定义的?没定义 所以它等于undefined..
color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:18px; text-align:left; background-color:rgb(247,247,247)" /> color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:18px; text-align:left; background-color:rgb(247,247,247)">J[F] = L; F等于属性名称..L等于值.J就等于我们的dest.
color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:18px; text-align:left; background-color:rgb(247,247,247)" /> color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:18px; text-align:left; background-color:rgb(247,247,247)">怎么样明白了没有..这样我们也可以写出很牛的继承函数了哦..
color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:18px; text-align:left; background-color:rgb(247,247,247)" /> color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:18px; text-align:left; background-color:rgb(247,247,247)">我先来个简单的.

color:initial; font-size:13px; vertical-align:baseline; line-height:18px; color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; text-align:left; background-color:rgb(247,247,247)"> color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:18px; text-align:left; background-color:rgb(247,247,247)">

<code class="language-javascript">(class="tags" href="/tags/FUNCTION.html" title=function>function(){
    var s={};
    s.extend=class="tags" href="/tags/FUNCTION.html" title=function>function(){
        var a=arguments[0]||{},
            e=false, //是否是深拷贝
            h=0,  //参数个数
            j=arguments[1],
            n=arguments.length,g;
            if(typeof arguments[0]==='boolean'){
                e=arguments[0];
                h=1;
            };
            for(;h<n;h++){
                g=arguments[h];
                if(typeof g !=class="tags" href="/tags/NULL.html" title=null>null){
                    for(var t in g){
                        if(e && g[t] && typeof g[t]=='class="tags" href="/tags/OBJECT.html" title=object>object' && !g[t].nodeType){//深拷贝
                            o.extend(e,(j||{}),g[t]);
                        }else{
                            if(g[t]!=undefined){
                                j[t]=g[t]; //拷贝
                            }
                        }
                    }
                }
            }
            return j;
    };
    var c=s.extend({a:10},{name:'siren',t:{age:20,sex:1}})
    console.log(c)
})()code>

color:initial; font-size:13px; vertical-align:baseline; line-height:18px; color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; text-align:left; background-color:rgb(247,247,247)"> 怎么样..是不是非常简单??
^.^

color:initial; font-size:13px; vertical-align:baseline; color:rgb(51,51,51); font-family:Tahoma,Arial,Helvetica,sans-serif; text-align:left; background-color:rgb(247,247,247)"> 原文出处: http://imsiren.com/archives/525

cle>

http://www.niftyadmin.cn/n/1790455.html

相关文章

7Linux存储结构和磁盘划分

FHS yum的.repo的配置文件多个的话&#xff0c;是依次生效吗&#xff1f; /boot 开机所需文件—内核、开机菜单以及所需配置文件等/dev 以文件形式存放任何设备与接口/etc 配置文件/home 用户主目录/bin 存放单用户模式下还可以操作的命令/lib 开机时用到的函数库&#xff0c;以…

原:用C/C++扩展PHP

声明&#xff1a;本文为 斯人 原创&#xff0c;全部为作者一一分析得之&#xff0c;有不对的地方望赐教。欢迎转载&#xff0c;转载请注明出处 。本文地址&#xff1a;http://imsiren.com/archives/547 一个简单的扩展模块PHP非常容易扩展,因为它提供了我们想用的所有API.如果要…

在Android Studio中查看SQLite数据库

原来查看数据库内容&#xff0c;我们一般都是将数据库文件从手机导出&#xff0c;再用专门的软件打开查看&#xff0c;比较繁琐。最近发现了一个比较方便的方法&#xff1a;使用工具stetho。 使用方式 在gradle中配置dependencies&#xff1a; dependencies { // Stetho core …

ExternalException (0x80004005): 无法执行程序

今天更新系统上传到阿里云服务器&#xff0c;报错如下&#xff1a; “/”应用程序中的服务器错误。 组策略阻止了这个程序。要获取详细信息&#xff0c;请与系统管理员联系。 说明: 执行当前 Web 请求期间&#xff0c;出现未经处理的异常。请检查堆栈跟踪信息&#xff0c;以了解…

自己写PHP扩展之创建一个普通变量

声明&#xff1a;本文为斯人原创&#xff0c;全部为作者一一分析得之&#xff0c;有不对的地方望赐教。 欢迎转载&#xff0c;转载请注明出处 。 本文地址&#xff1a; http://imsiren.com/archives/568PHP写扩展..如果您还么有读 原:用C/C扩展PHP建议您先看一下 这篇文章..…

Hibernate- 分页查询

01.搭建环境 02.分页查询 package com.gordon.test;import java.util.List;import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test;import com.gordon.domain.Book; import com.gordon.utils.HibernateUtil;/**…

Linux下的python等操作【转载】

转自&#xff1a;https://blog.csdn.net/healthy_coder/article/details/50546384 https://blog.csdn.net/boyun58/article/details/77131489 1.查看已安装的包 在命令行下运行$ pydoc modules即可查看 2.安装python包 直接pip install 包名即可 3.查看python位置 whereis pyth…

微服务时代之2017年五军之战:Net PHP谁先死

其实我一直是个懒人&#xff0c;开博也有好几年了&#xff0c;但是一直懒得写文章&#xff0c;主要怕打字麻烦&#xff0c; 手机都是用讯飞语音输入的&#xff0c; 可惜博客里面很多专业性的词语&#xff0c;用讯飞也不大好&#xff0c;另外无论在家还是在公司&#xff0c;开个…