您当前的位置:首页 > 互联网教程

dayjs源码解析(二):Dayjs 类

发布时间:2025-05-23 23:36:41    发布人:远客网络

dayjs源码解析(二):Dayjs 类

一、dayjs源码解析(二):Dayjs 类

1、上篇文章讲述了dayjs的基础知识、locale、constant和utils,本文将继续深入解析dayjs的核心部分——src/index.js中的Dayjs类。

2、src/index.js文件结构清晰,按照以下步骤构建:

3、然而,这里存在两个疑问,可能是为了缩减代码体积,由@iamkun提出。

4、首先默认导入了locale/en.js英文的locale,然后使用L存储当前使用的locale名字,使用Ls(locale Storage)存储locale对象。

5、定义了一个工具方法parseLocale。这个方法处理以下几种情况:

6、然后将定义好的parseLocale方法补充到Utils中。

7、在Dayjs类中,关于locale的方法有两个,实例私有方法$locale用来返回当前使用的locale对象;实例方法locale本质上就是调用了parseLocale方法,但最后返回的是新的改变了locale的Dayjs实例。

8、注意:在dayjs中,许多操作都使用clone()方法来返回新的Dayjs实例,这也是这个库的优点之一。

9、最后同样将parseLocale方法补充到Dayjs类的静态方法中。

10、上一节和前文中已经分析了一些Util工具,这里将其补充完整:

11、注意:这些工具方法没有统一定义在utils.js文件中的原因是用到了index.js作用域中的一些变量。

12、需要特别关注的是wrapper方法,在Dayjs类中大量应用了该方法,其实是通过date和原实例封装了一个新实例,新实例和原实例的主要区别就是关联的时间不同。

13、Dayjs类是整个dayjs库的核心,可以给其定义的实例方法分类,也可以查看官网的文档分类。

14、通常来说,定义在实例中的方法应该在原型链上,但有几个与时间有关的setter/getter方法相似,所以单独将原型链写在了上面。

15、这几个方法都是不传参数时为getter,传参数时为setter。

16、还有一些方法和属性挂在了dayjs函数对象上,最核心的是加载插件和加载locale的方法,几个方法的用法都能在官方文档中找到。

17、如果对dayjs函数对象、Dayjs类和原型的关系感到困惑,可以参考下图,最后形成的关系如下图所示:

18、如果不看插件部分,dayjs库的核心已经解析完成,看一下默认生成dayjs实例长什么样子:

19、实例本身的属性是一些与时间相关的属性,各种操作方法都在原型__proto__上。

20、本节结束,下一节将开始解析dayjs的插件。

二、lodash源码分析——deepclone

lodash源码分析——deepclone,基于4.17.10版本

本文从源码阅读初心者的角度,一句一句深入分析lodash的deepclone方法,从入口函数开始,逐步解析每一个关键步骤。

入口函数调用cloneDeep.js,通过掩码位判断是否进行深拷贝与复制symbol类型。

在baseClone.js中,通过内部函数调用baseClone进行主要逻辑处理。先判断对象是否为普通对象,然后使用getTag方法获取对象的类型标识。

getTag方法通过baseGetTag进行判断,获取symbol类型时返回symbol.toStringTag属性。现代浏览器支持返回特定类型标签,如内置对象类型或新出现的类型如Map、Promise等。对于自定义类创建的对象,若无特定标签则返回[object Object]。

继续解析baseClone逻辑,重点在于针对不同类型的对象进行区分处理,包括数组、普通对象、函数等。函数和空对象返回{},不进行深拷贝。

在处理复杂类型如数组和对象时,baseClone采用initCloneArray和copyArray函数优化拷贝过程。对于循环引用问题,通过构造栈结构解决,保证了代码的兼容性和易用性。

对于symbol类型,通过Object.getOwnPropertySymbols方法获取symbol的副本,确保深拷贝操作的完整性。

总结,lodash的deepclone方法通过Object.prototype.toString.call得到对象的类型标识,根据标识进行针对性处理,同时解决循环引用问题,兼容现代浏览器的symbol类型。然而,对于function类型仍然采用引用拷贝,未进行深拷贝处理原型链上的属性。

本文由某初学者撰写,旨在分享lodash deepclone源码分析过程,提供一个从入门到深入理解的路径参考。完成日期:2018年7月22日。