热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

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

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

好久没写jquery源码的内容了..
jquery的发展有很大因素是因为它非常易于扩展,究其原因就得益于 extend函数
该函数是一个扩展函数…说是一个扩展函数,其实就是一个浅拷贝和深拷贝的函数而已.
该函数 确实很强大,而且写的很优雅..
先来看看用法,有三种用法.
1、$.extend(dest,src1,src2,src3…);
2、$.extend(src)
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}}
);
如果第一个值为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.
那么看看源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
o.extend = o.fn.extend =function() {
        varJ = arguments[0] || {},
        H = 1,
        I = arguments.length,
        E =false,
        G;
        if(typeofJ ==="boolean") {
            E = J;
            J = arguments[1] || {};
            H = 2
        }
        if(typeofJ !=="object"&& !o.isFunction(J)) {
            J = {}
        }
        if(I == H) {
            J =this; --H
        }
        for(; H
            if((G = arguments[H]) !=null) {
                for(varFinG) {
                    varK = J[F],
                    L = G[F];
                    if(J === L) {
                        continue
                    }
                    if(E && L &&typeofL ==="object"&& !L.nodeType) {
                        J[F] = o.extend(E, K || (L.length !=null? [] : {}), L)
                    }else{
                        if(L !== g) {
                            J[F] = L
                        }
                    }
                }
            }
        }
        returnJ
    };

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
(function(){
    vars={};
    s.extend=function(){
        vara=arguments[0]||{},
            e=false,//是否是深拷贝
            h=0, //参数个数
            j=arguments[1],
            n=arguments.length,g;
            if(typeofarguments[0]==='boolean'){
                e=arguments[0];
                h=1;
            };
            for(;h
                g=arguments[h];
                if(typeofg !=null){
                    for(varting){
                        if(e && g[t] &&typeofg[t]=='object'&& !g[t].nodeType){//深拷贝
                            o.extend(e,(j||{}),g[t]);
                        }else{
                            if(g[t]!=undefined){
                                j[t]=g[t];//拷贝
                            }
                        }
                    }
                }
            }
            returnj;
    };
    varc=s.extend({a:10},{name:'siren',t:{age:20,sex:1}})
    console.log(c)
})()

怎么样..是不是非常简单??
^.^


推荐阅读
author-avatar
Liushan2502897753
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有