博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jQuery对象扩展方法(Extend)深度解析
阅读量:6849 次
发布时间:2019-06-26

本文共 3310 字,大约阅读时间需要 11 分钟。

1、这几天在写自己的Js工具类库,所以在编写对象扩展方法,参考了jQuery的对象扩展方法,在编写该方法前,需要掌握js深拷贝和浅拷贝的相关知识,下面是jQuery3.2.1版本对象扩展方法的源码:

jQuery.extend = jQuery.fn.extend = function() {    var options, name, src, copy, copyIsArray, clone,        target = arguments[ 0 ] || {},        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 ] || {};        i++;    }    // Handle case when target is a string or something (possible in deep copy)    if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {        target = {};    }    // Extend jQuery itself if only one argument is passed    if ( i === length ) {        target = this;        i--;    }    for ( ; i < length; i++ ) {        // Only deal with non-null/undefined values        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;                }                // Recurse if we're merging plain objects or arrays                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 ) {                    target[ name ] = copy;                }            }        }    }    // Return the modified object    return target;};

下面是我的解释代码:

zcHtmlHelper.extend=zcHtmlHelper.fn.extend=function(){    var target=arguments[0]||{},//第一个参数        deep = false,//是否开启深拷贝功能,默认不是        i=1,        length=arguments.length,        options,        name,        src,        copy,        copyIsArray,        clone;    //处理深拷贝场景    if(typeof target==="boolean"){        deep=true;        target=arguments[i] || {};//将紧随其后的存放拷贝值的集合        i++;//加1的原因是,一旦开启深拷贝功能,那么传入的参数就至少有两个,一个是深拷贝的开关另一个是扩展参数,否则当只传如一个深拷贝的开关,那么方法将返回空集合    }    if(typeof target!=="object"){        target = {};    }    //这个判断有两种情况    //1、当传入的参数只有一个(不能是true或者false),那么就扩展当前命名空间    //2、当传入的参数有个两个,分别是深拷贝的开关(true或者false)和扩展参数,那么就扩展当前命名空间    if(i==length){        target=this;        i--;    }    for(;i

 

2、代码验证

(1)、浅拷贝代码:

var names=[1,3,4,5,6];var defaults = { validate: false, limit: 5, name: "foo" };var options = { names: names};var settings = zcHtmlHelper.extend(false,defaults,options);alert(names==settings.names);

首先对象拷贝成功,settings是两个对象的合集,但是name数组对象和settings.name属性是同一个引用,所以,这是前拷贝

 

(2)、深拷贝代码:

var names=[1,3,4,5,6];var defaults = { validate: false, limit: 5, name: "foo" };var options = { names: names};var settings = zcHtmlHelper.extend(true,defaults,options);alert(names==settings.names);console.log(settings);

 

转载地址:http://jjrul.baihongyu.com/

你可能感兴趣的文章
openssl 非对称加密 RSA 加密解密以及签名验证签名
查看>>
MyBatis Generator生成DAO——序列化
查看>>
算法笔记_175:历届试题 蚂蚁感冒(Java)
查看>>
pdb文件是什么
查看>>
.Net 跳转
查看>>
vim搭建笔记
查看>>
人要有畏惧之心
查看>>
SpringCloud学习笔记(4)——Zuul
查看>>
mysql主从备份及原理分析
查看>>
Docker 入门 --- 命令总结
查看>>
MySQL 批量写入数据报错:mysql_query:Lost connection to MySQL server during query
查看>>
【spring boot】spring boot中使用@RestController不起作用,不返回json,依旧去找访问接口的请求地址对应的页面...
查看>>
简约响应式布局样式
查看>>
iOS平台XML解析类库对比和安装说明
查看>>
各种纪念-好久没更新了
查看>>
渴望出差
查看>>
非常酷的国外网站导航设计案例欣赏
查看>>
xp sp3+iis 服务器不可用
查看>>
【windows phone】控件1
查看>>
使用curl抓取网页遇到HTTP跳转时得到多个HTTP头部的问题
查看>>