我很久没有发表文章了,今天我突然分析了在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