分析了扩展方法在jQuery中的实现原理。

分析了扩展方法在jQuery中的实现原理。
我很久没有发表文章了,今天我突然分析了在jQuery中实现扩展方法的原理,目的是为了提高对jQuery的理解,也了解Javascript高手是如何编写js的,如果有不足之处,请改正,谢谢。

以下是这jquery.extend方法的源代码:

复制代码代码如下所示:

jquery.extend = jquery.fn.extend =函数(){()

VaR的选项名字,SRC,复制,copyisarray,克隆,

目标=论点{ 0 } | | { }, / /目标

我= 1,

长度= arguments.length,

深=假;

深度复制(第一个参数是type和true)

如果(typeof目标=布尔){

深=目标;

目标=论点{ 1 } | | { };

第一个参数(是否跳过深度复制)和第二个参数(目标)

我= 2;

}

如果目标不是一个对象或函数,则初始化为空对象。

如果(typeof = =对象的目标!jquery.isfunction!(目标){

目标{ };

}

如果您只指定一个参数,则使用jQuery作为其目标。

如果(长度= i){

目标=此;

——我;

}

为(;;i;<长度;i + +){

处理非空的/未定义的值

如果((选项=参数{ })!= NULL){

基本对象扩展

对于(选项中的名称){

目标= { };

复制=选项{名称};

永不终止循环

如果(目标=复制){

继续;

}

如果对象包含数组或其他对象,则使用递归复制。

如果(深拷贝(jquery.isplainobject(复印件)| |(copyisarray = jquery.isarray(副本)))){

数组处理

如果(copyisarray){

copyisarray = false;

如果目标对象不存在于数组中,则创建一个空数组;

钢骨混凝土(SRC)克隆= jquery.isarray SRC:{ };

{人}

钢骨混凝土(SRC)克隆= jquery.isplainobject SRC:{ };

}

不改变原始对象,只复制

{姓名} =目标jquery.extend(深、克隆、复制);

不要复制未定义的值

否则如果}(副本)!=未定义的){

目标{ } =复制;

}

}

}

}

对象返回已被修改

将目标;

};
从上面的分析中,我们可以看到扩展函数支持深度拷贝,那么js中的深层副本是什么呢
我的理解如下:如果引用对象包含一个对象(如数组或对象),则对象的副本不是简单地引用对象副本的地址,而是引用存储在单个对象(以下)中的对象副本的内容。
它可以从上面的图中看到,两个学生共享一个朋友的对象,和其他也在朋友的对象的另一侧可见。如果你让你的朋友姓张三,然后另一个对象可以看出。
从上面可以看出,两个学生的对象都有自己的朋友,而且对一面的修改是完全透明的(没有任何影响)。以上是我对复制深度的理解,有什么不对的,请不要笑,谢谢。

所以,如何jquery.extend方法并实施浅复制和深副本吗

jquery.extend用法:

1、JQuery.extend(源对象)
源对象扩展到jQuery对象,即将源对象的属性和方法复制到jQuery:

复制代码代码如下所示:

如果您只指定一个参数,则使用jQuery作为其目标。

如果(长度= i){

目标=此;

——我;

}
{实例1 }:将人对象的方法扩展到jQuery对象。

复制代码代码如下所示:

var

性别:凸出的,

showName:功能(name){

警报()name+;

}

};

jquery.extend(人); / /人将对象扩展到jQuery对象(美元)

jquery.showname(admin); / /名称:admin

美元。showName(admin); / /名称:文件大小

警戒(性别:+美元。性);性别:男性
{示例2 }验证这种扩展方法用于浅复制的方法。

复制代码代码如下所示:

var

语言:{ 'java,C + +,'sql},

showName:功能(name){

警报()name+;

}

};

jquery.extend(人); / /人将对象扩展到jQuery对象(美元)

警报(美元。语言); / / java,C++,SQL

美元。language.push('pl / SQL); / /对象修改后的延伸

警报(人的语言); / / java,C++,SQL,PL / SQL

person.language.pop();

警报(美元。语言); / / java,C++,SQL
从上面的示例中,我们可以发现,通过扩展对象($)和源对象(人)对语言数组的任何修改都会影响另一方。
2、JQuery.extend(目标对象,源对象)
将源对象的属性和方法复制到目标对象,并使用浅拷贝。

{案例}创建人和学生对象分别,然后延长人的学生对象的属性和方法的jquery.extend方法。

复制代码代码如下所示:

var

语言:{ 'java,C + +,'sql},

showName:功能(name){

警报()name+;

}

};

var学生{ {

shownum:功能(NUM){

警报();

}

};

JQuery.extend(生人); / /人将对象扩展到指定的学生对象

student.showname(admin);

警惕(学生,语言);
3、JQuery.extend(布尔,源对象)
以这种方式表示的布尔参数表示是否使用深度复制,如果是真的,则使用深度复制。

{将对象扩展到jQuery对象

复制代码代码如下所示:

var

语言:{ 'java,C + +,'sql},

showName:功能(name){

警报()name+;

}

};

JQuery.extend(真实的人); / /人对象jQuery对象的扩展

警报(美元。语言); / / java,C++,SQL

美元。language.push('pl / SQL); / /对象修改后的延伸

警报(人的语言); / / java,C++,SQL

person.language.pop();
从上面的例子可以看出,修改$语言不会直接影响语言属性,这是深度复制。
4、JQuery.extend(布尔,目标对象,源对象)
决定是否使用深度复制将源对象扩展到目标对象:

{案例}创建人和学生对象分别,然后延长人的学生对象的属性和方法的jquery.extend方法。

复制代码代码如下所示:

var

showName:功能(name){

警报()name+;

}

};

var学生{ {

语言:{java

shownum:功能(NUM){

警报();

}

};

VaR目标= jquery.extend(人、学生);

警报(目标语言); / / java,C++,Javascript

Target.language.push(PL / SQL);

警报(学生语言); / / java,C++,Javascript,PL / SQL

Student.language.pop();

警报(目标语言); / / java,C++,Javascript

VaR Target2 = jquery.extend(真正的人,学生);

警报(TARGET2。语言); / / java,C++,Javascript

target2.language.push(PL / SQL);

警报(学生语言); / / java,C++,Javascript

Student.language.pop();

警报(TARGET2。语言); / / java,C++,Javascript,PL / SQL
以上是我的推广方法的理解,如果有不对的地方,请改正。非常感谢你 uff01
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部