a、jQuery.extend( source )
b、jQuery.extend(destination, source1, source2, source3 ....)

c、jQuery.extend(boolean, destination, source1, source2, source3 ....)

  以上是jquery的extend实现方法

首先是第一种:传入一个源函数,拓展自己

 var Test = function(){};
Test.prototype.extend = function(source){
for(var key in source){
this[key] = source[key]
}
return this;
}
var Myobj = {
name:'qiaoming'
}
var test = new Test();
console.log(test.extend(Myobj))

然后是第二种:传入一个源函数,拓展目标对象

    function extend(d,s){
for(var key in s){
d[key] = s[key]
}
}

首先写一个拓展对象的方法

Test.prototype.extend = function(){
var source , destination
if(arguments.length === ){
destination = this;
source = arguments[];
extend(destination,source)
return destination;
}
if(arguments.length > ){
var len = arguments.length;
destination = arguments[];
source = [].splice.call(arguments,,len); for(var i=,l=source.length;i<l;i++){
var s = source[i];
extend(destination,s)
}
return destination;
}
function extend(d,s){
for(var key in s){
d[key] = s[key]
}
}
}

根据参数数量,选择拓展方法

第三种根据第一个参数是否为布尔值,判断是否进行深拷贝

根据第一个参数是否为布尔值进行判断

    function extend(d,s,b){
var d = d;
if(b && b===true){
for(var key in s){
var v = s[key];
// 假如v还是object
if(v instanceof Array){
d[key] = extend(d[key] || [] , v , true);
}else if(v instanceof Object){
d[key] = extend(d[key] || {} , v , true);
}else{
d[key] = v;
}
}
}else{
for(var key in s){
var v = s[key];
d[key] = v;
}
}
return d
}

重构extend,拥有第三个参数如果为true就深拷贝

最后的代码如下

Test.prototype.extend = function(){
var source , destination
if(arguments.length === ){
destination = this;
source = arguments[];
extend(destination,source)
}
if(arguments.length > ){
var len,destination,source;
if( arguments[] === true ){
len= arguments.length;
destination = arguments[];
source = [].splice.call(arguments,,len);
for(var i=,l=source.length;i<l;i++){
var s = source[i];
extend(destination,s,true)
}
}else{
var len = arguments.length;
destination = arguments[];
source = [].splice.call(arguments,,len);
for(var i=,l=source.length;i<l;i++){
var s = source[i];
extend(destination,s)
}
}
return destination;
}
function extend(d,s,b){
var d = d;
if(b && b===true){
for(var key in s){
var v = s[key];
// 假如v还是object
if(v instanceof Array){
d[key] = extend(d[key] || [] , v , true);
}else if(v instanceof Object){
d[key] = extend(d[key] || {} , v , true);
}else{
d[key] = v;
}
}
}else{
for(var key in s){
var v = s[key];
d[key] = v;
}
}
return d
}
}

这样我们就可以实现一个对象的深浅拷贝

jquery源码学习(四)—— jquery.extend()的更多相关文章

  1. jQuery 源码学习 - 02 - jQuery.fn.extend 与 jQuery.extend

    参考资料:[深入浅出jQuery]源码浅析--整体架构,备用地址:chokcoco/jQuery-. extend 方法在 jQuery 中是一个很重要的方法.jQuery 内部用它来拓展静态方法或者 ...

  2. jquery源码学习笔记三:jQuery工厂剖析

    jquery源码学习笔记二:jQuery工厂 jquery源码学习笔记一:总体结构 上两篇说过,query的核心是一个jQuery工厂.其代码如下 function( window, noGlobal ...

  3. jquery源码学习(一)——jquery结构概述以及如何合适的暴露全局变量

    jQuery 源码学习是对js的能力提升很有帮助的一个方法,废话不说,我们来开始学习啦 我们学习的源码是jquery-2.0.3已经不支持IE6,7,8了,因为可以少学很多hack和兼容的方法. jq ...

  4. jQuery源码学习扒一扒jQuery对象初使化

    神奇的jQuery可以这样玩jQuery("#id").css()或 jQuery("#id").html() 这么玩jQuery("#id" ...

  5. jquery 源码学习(四)构造jQuery对象-工具函数

    jQuery源码分析-03构造jQuery对象-工具函数,需要的朋友可以参考下.   作者:nuysoft/高云 QQ:47214707 EMail:nuysoft@gmail.com 声明:本文为原 ...

  6. jQuery源码学习感想

    还记得去年(2015)九月份的时候,作为一个大四的学生去参加美团霸面,结果被美团技术总监教育了一番,那次问了我很多jQuery源码的知识点,以前虽然喜欢研究框架,但水平还不足够来研究jQuery源码, ...

  7. 读艾伦的jQuery的无new构建,疑惑分析——jquery源码学习一

    背景: 有心学习jquery源码,苦于自己水平有限,若自己研究,耗时耗力,且读懂之日无期. 所以,网上寻找高手的源码分析.再经过自己思考,整理,验证.以求有所收获. 此篇为读高手艾伦<jQuer ...

  8. jquery 源码学习(一)

    从上边的注释看,jQuery的源码结构相当清晰.条理,不像代码那般晦涩和让人纠结   1. 总体架构 1.1 自调用匿名函数 self-invoking anonymous function 打开jQ ...

  9. jquery 源码学习(*)

    最近在做日志统计程序,发现对方的程序是在Jquery基础上进行开发的,而公司的网站的框架是prototype.而且我也早就想了解一下Jquery源码,故决定研究Jquery源码,模拟它的方法   Jq ...

  10. 菜鸟的jQuery源码学习笔记(前言)

    前言 相信任何一名前端开发人员或者是前端爱好者都对jQuery不陌生.jQuery简单易用,功能强大,特别是拥有良好的浏览器兼容性,大大降低了前端开发的难度,使得前端开发变得“平易近人起来”.自从本人 ...

随机推荐

  1. 使用HttpStaus自定义返回状态

    一.导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  2. It's a Mod, Mod, Mod, Mod World (类欧几里得模板题

    https://vjudge.net/contest/317000#problem/F #include <iostream> #include <cstdio> #inclu ...

  3. Python---求100以内的质数

    1.首先什么是质数: 一个大于1的正整数,如果除了1和它本身以外,不能被其他正整数整除,就叫质数,也叫素数.如2,3,5,7,11,13,17…. 2.代码如下: 这里做个解析:①Python的for ...

  4. day2-元组、字典、文件操作

    学习内容: 1. 元组操作 2. 字典操作 3. 文件操作 4. 深浅copy 1. 元组操作: 元组和列表非常相似,只不过元组不能在原处修改(它是不可变的),并且通常写成圆括号中的一系列项. # 元 ...

  5. 0907NOIP模拟测试赛后总结

    120分rank26.我又被打回原型了…… 下午考的.中午由于种种原因并没有睡好.于是状态很差. 第一眼看题感觉T1是一道XX题.部分分竟然给这么肥 然后看T2.T3好像都还不是特别恶心的题目,挺常规 ...

  6. 「题解」:[POJ2942]Knights of the Round Table

    问题 E: Knights of the Round Table 时间限制: 1 Sec  内存限制: 256 MB 题面 题目描述 作为一名骑士是一个非常有吸引力的职业:寻找圣杯,拯救遇难的少女,与 ...

  7. flask请求上下文源码分析

    一.什么是上下文 每一段程序都有很多外部变量,只有像add这种简单的函数才是没有外部变量的,一旦你的一段程序有了外部变量,这段程序就不完整了,不能独立运行,你为了使他们能运行,就要给所有的外部变量一个 ...

  8. iframe跨域数据传递

    项目中需要和其他单位合作开发,方案采用iframe嵌入页面,开发过程中设计到了跨域数据的传递,初步方案决定使用html5 API postMessage进行iframe跨域数据传递: 域名A下的页面 ...

  9. Java-slf4j:sfl4j

    ylbtech-Java-slf4j:sfl4j 1.返回顶部 1. SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种 ...

  10. CoreData手动创建托管对象子类时报错

    1.具体问题 手动创建CoreData,在进行创建托管对象子类时出现报错如图: 2.解决方法 当使用CoreData时,Xcode自动管理实体类,文件都放在Derived Data文件夹中: 所以不需 ...