好久没发帖子了。今天突然分析了JQuery中extend方法的实现原理。为了提高对JQuery的理解,我还想知道JavaScript高手是怎么写JS的。如有不足,请指正。谢谢你
以下是JQuery.extend方法的源代码:
复制代码如下: jquery . extend=jquery . fn . extend=function(){ varoptions,name,src,copy,copyisarray,clone,target=arguments [0] | | {},//target object I=1,length=arguments.length,deep=false。//如果(target===' boolean ')的类型为{deep=target,则处理深度复制(第一个参数为boolean和true);target=参数[1]| | { };//跳过第一个参数(是否深度复制),第二个参数(目标对象)I=2;}//如果目标不是对象或函数,则在(目标类型!=='对象'!jquery . IsFunction(target)){ target={ };}//如果只指定了一个参数,则jQuery本身在(length===I){ target=this;-我;} for(;一、长度;i ) { //仅处理非空/未定义的值,如果((选项=参数[ i ])!=null ) { //扩展(选项中的名称)的基础对象{ src=target[name];copy=options[name];//防止永不结束的循环if(target===copy){ continue;}//如果对象包含数组或其他对象,则使用递归复制if(深度复制(jquery . isplayanobject(copy)| |(copy isarray=jquery . isarray(copy))){//处理数组if(copy isarray){ copy isarray=false;//如果目标对象中不存在数组,则创建一个空数组;clone=src jQuery.isArray(src)?src :[];} else { clone=src jquery . isplayanobject(src)?src : { };}//永远不要改变原对象,只做一个副本目标[name]=jquery.extend (deep,clone,copy);//不要复制未定义的值}否则如果(复制!==未定义){ target[name]=copy;} } } }//返回修改后的对象返回目标;};
从上面的分析可以看出,extend函数支持深度复制,那么JS中什么是深度复制呢?我的理解是这样的:如果一个对象包含引用对象(如数组或对象),在复制对象时,不是简单的复制引用对象的地址,而是复制引用对象的内容,保存为单独的对象(如下图)。
从上图可以看出,两个学生对象共享一个好友对象,一方可以操作好友对象,另一方也可以看到。比如你把闺蜜的姓改成“张三”,对方对象也能看到。
从上图可以看出,两个学生对象都有自己的朋友对象,一方的修改对另一方完全透明(没有任何影响)。以上是我对深度复制的理解,请不要嘲笑任何错误,谢谢。
那么JQuery.extend如何实现浅层复制和深层复制呢?
JQuery.extend的用法:
1.JQuery.extend(源对象)。
将源对象展开为jQuery对象,即将源对象的属性和方法复制到jQuery。使用jQuery作为目标对象,源代码如下:
复制代码如下://如果只指定了一个参数,jQuery本身作为目标对象如果(长度===I){ target=this;-我;}
[示例1]:将person对象的方法扩展到jQuery对象。
复制代码如下: varperson={sex:' male ',showname : function(name){ alert(' name : ' name);} };jquery . extend(person);//将person对象扩展到jQuery($)对象上的jQuery . showname(' admin ');//名称: admin $。show name(' admin ');//name : amdin alert(' Sex : ' $)。性);//Sex:男
[例2]验证了这种形式的扩展方法是浅层复制。
复制代码代码如下: var person={ language :[' Java ',' c ',' sql'],showName : function(name){ alert(' name : ' name);} };jquery。延伸(人);//将人对象扩展到jQuery($)对象上警报($。语言);//java,c,SQL $。语言。推送(' PL/SQL ');//修改扩展后的对象警惕(人。语言);//java、c、sql、PL/SQL人。语言。pop();警报($。语言);//java、c、sql
从上面例子中可以发现,被扩展后的对象($)和源对象(人)任何一方对语言数组的修改,都会影响到另一方。这就是浅复制
2、JQuery.extend(目标对象,源对象)
将源对象的属性和方法复制到目标对象上,采用浅复制。【实例】分别创建人和学生对象,然后通过jQuery.extend方法将人的属性和方法扩展到学生对象。
复制代码代码如下: var person={ language :[' Java ',' c ',' sql'],showName : function(name){ alert(' name : ' name);} };var student={ ShowNum : function(Num){ alert(' Num : ' Num);} };jQuery.extend(学生,人);//将人对象扩展到指定的学生对象上学生。显示名称(' admin ');警报(学生。语言);
3、JQuery.extend(布尔值,源对象)
此种方式中的布尔参数表示是否采用深度复制,如果为没错,则使用深度复制。【实例】将人对象扩展到框架对象上
复制代码代码如下: var person={ language :[' Java ',' c ',' sql'],showName : function(name){ alert(' name : ' name);} };jQuery.extend(true,person);//将人对象扩展框架对象上警报($。语言);//java,c,SQL $。语言。推送(' PL/SQL ');//修改扩展后的对象警惕(人。语言);//java,c,SQL人。语言。pop();
从上面例子中可以看出对$.语言的修改不会影响到人中的语言属性。这就是深度复制
4、JQuery.extend(布尔值,目标对象,源对象)
决定是否采用深度复制将源对象扩展到目标对象上面。如下:【实例】分别创建人和学生对象,然后通过jQuery.extend方法将人的属性和方法扩展到学生对象。
复制代码代码如下: var person={ show name : function(name){ alert(' name : ' name);} };var student={ language :[' Java ',' c ',' javascript'],showNum : function(Num){ alert(' Num : ' Num);} };var target=jQuery.extend(人、学生);警报(目标语言);//java,c,JavaScript目标。语言。推送(' PL/SQL ');警报(学生。语言);//java、c、javascript、PL/SQL学生。语言。pop();警报(目标语言);//java,c,JavaScript var target 2=jquery。扩展(真、人、学生);警报(目标2。语言);//java,c,JavaScript目标2。语言。推送(' PL/SQL ');警报(学生。语言);//java,c,JavaScript学生。语言。pop();警报(目标2。语言);//java、c、javascript、PL/SQL
以上就是我对扩展方法的理解,如有不正确的地方请指正。非常谢谢!