对象继承函数: $.extend(){},默认传递一个参数,需要继承的对象目标。函数展示:

zepto源码--extend--学习笔记

最终实现的过程,需要调用工具函数extend,首先分析extend函数。

默认传递三个参数,继承的目标对象-target,继承的源对象-source,是否为深拷贝-deep

zepto源码--extend--学习笔记

遍历源对象,分两种情况:

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获取,以及拆分。zepto源码--extend--学习笔记

定义变量deep, 获取用户传入的其他参数。

如果用户传入的第一个参数是个布尔值,则表明用户想进行深拷贝或者浅拷贝

则将参数target值赋值给deep,目标对象则为剩余参数当中的第一个,通过获取args的第一个值表示target

zepto源码--extend--学习笔记

args已经转换为数组形式,所以通过数组方法shift()获取args中的第一个值。

为避免用户输入多个源对象进行拷贝,即用户传入了类似$.extend(true, {}, {}, {}, ...)的参数,所以需要对args进行遍历,对每一个源对象调用前文讲解的extend方法。

zepto源码--extend--学习笔记

最后将复制结果target返回zepto源码--extend--学习笔记

 

 

 

 

  

相关文章:

  • 2021-05-28
  • 2021-08-04
  • 2021-08-23
  • 2021-07-09
  • 2022-02-22
  • 2022-01-05
  • 2022-12-23
  • 2021-06-14
猜你喜欢
  • 2021-09-24
  • 2021-10-07
  • 2021-10-24
  • 2021-10-10
  • 2021-06-18
  • 2022-02-09
相关资源
相似解决方案