对象继承函数: $.extend(){},默认传递一个参数,需要继承的对象目标。函数展示:
最终实现的过程,需要调用工具函数extend,首先分析extend函数。
默认传递三个参数,继承的目标对象-target,继承的源对象-source,是否为深拷贝-deep
遍历源对象,分两种情况:
1、浅拷贝:只要source[key]有值,就将其值赋值给target对应的key,即target[key];
2、深拷贝:就是如果源对象的属性值,也是对象或者数组,则进行同样的拷贝操作。以对象为例:{'name': 'zhuhuoxingguang', 'age': 26, 'brother': ['jiuwan', 'hao', 'xu']},完完全全复制该对象,即为深拷贝。也分为两种可能:主要目的是为了确定对应的target[key]应当赋值什么类型。
a). 如果是数组,则将对应的target[key] 赋值空数组[]
b). 如果是对象,则将对应的target[key] 赋值空对象{}
最后,递归调用函数自身extend(target[key], source[key], deep)实现真正的深拷贝。
现在再来看对外暴露的真实的继承函数$.extend,为了不强制用户传递不必要的参数,设置默认参数只有target,如果用户传递了其他参数,则通过arguments获取,以及拆分。
定义变量deep, 获取用户传入的其他参数。
如果用户传入的第一个参数是个布尔值,则表明用户想进行深拷贝或者浅拷贝
则将参数target值赋值给deep,目标对象则为剩余参数当中的第一个,通过获取args的第一个值表示target
args已经转换为数组形式,所以通过数组方法shift()获取args中的第一个值。
为避免用户输入多个源对象进行拷贝,即用户传入了类似$.extend(true, {}, {}, {}, ...)的参数,所以需要对args进行遍历,对每一个源对象调用前文讲解的extend方法。
最后将复制结果target返回