对象继承函数: $.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返回

 

 

 

 

  

posted on 2016-11-02 09:53  烛火星光  阅读(997)  评论(0编辑  收藏  举报