dayjs 源码解析(三)(dayjs 构造函数)

前言上一篇 dayjs 源码解析(二)(目录结构)介绍了 dayjs 的源码目录结构。接下来,本篇将解读一下 index.js 中的 dayjs 构造函数。dayjs 构造函数// d 是否为 Dayjs 的实例对象const isDayjs = d => d instanceof Dayjs// dayjs 函数,用...
摘要由CSDN通过智能技术生成

前言

上一篇 dayjs 源码解析(二)(目录结构)介绍了 dayjs 的源码目录结构。接下来,本篇将解读一下 index.js 中的 dayjs 构造函数。

dayjs 构造函数


// d 是否为 Dayjs 的实例对象
const isDayjs = d => d instanceof Dayjs

// dayjs 函数,用于返回新的 Dayjs 实例对象的函数
const dayjs = (date, c) => {

  // 若date 为 Dayjs 的实例对象,则返回克隆的 Dayjs 实例对象(immutable)
  if (isDayjs(date)) {
    return date.clone()
  }

  const cfg = c || {}

  cfg.date = date

  return new Dayjs(cfg)
}
// Dayjs 类
class Dayjs {
  //...
}

翻看 第一篇 中介绍的 api,有哪些 api 会用到 dayjs() 构造函数呢?在构造一个新的 Dayjs 实例对象的时候会用到 dayjs()。
即 “解析类中的构造克隆

clipboard.png

dayjs 函数的参数 date 和 c

参数 date

首先看参数 date。在上面的 api 中,我们可以看到,date 参数可以有五种类型,这五种类型可以分为两类:

一、非 Dayjs 实例对象:

  • 不传参,即 date 为undefined
  • date 为 ISO 8601 标准格式的字符串
  • date 为 unix 时间戳
  • date 为 JavaScript 原生的 Date 实例对象

二、Dayjs 实例对象

  • date 为 Dayjs 实例对象
当 date 参数为 “非 Dayjs 实例对象” 时

// d 是否为 Dayjs 的实例对象
const isDayjs = d => d instanceof Dayjs

// dayjs 函数,用于返回新的 Dayjs 实例对象的函数
const dayjs = (date, c) => {

  // 若date 为 Dayjs 的实例对象,则返回克隆的 Dayjs 实例对象(immutable)
  if (isDayjs(date)) {
    return date.clone()
  }

  const cfg = c || {}

  cfg.date = date

  return new Dayjs(cfg)
}
// Dayjs 类
class Dayjs {
  //...
}
// 调用 dayjs 函数
dayjs('2018-7-1')

此时,c 参数(后面会讲 c 参数的作用)为空,所以 cfg 变量被赋值为一个 空对象{}

然后将传入的 date 参数赋值给 cfg 对象的 date 属性。最后将 cfg 传入 Dayjs 类的构造函数,生成一个 Dayjs 对象,作为 dayjs() 函数的返回值给返回了。

所以,最终 dayjs() 函数返回的是一个 Dayjs 实例对象。

当 date 参数为 “Dayjs 实例对象” 时

// d 是否为 Dayjs 的实例对象
const isDayjs = d => d instanceof Dayjs

// dayjs 函数,用于返回新的 Dayjs 实例对象的函数
const dayjs = (date, c) => {

  // 若date 为 Dayjs 的实例对象,则返回克隆的 Dayjs 实例对象(immutable)
  if (isDayjs(date)) {
    return date.clone()
  }

  const cfg = c || {}

  cfg.date = date

  return new Dayjs(cfg)
}
// Dayjs 类
class Dayjs {
  //...
}
// 调用 dayjs 函数
dayjs(dayjs())

因为传入的 date 参数为 Dayjs 实例对象,所以 isDayjs(date) 返回 true,然后调用 date.clone() 方法。
通过阅读 Dayjs 类的代码,可知道,clone() 不是挂载到 Dayjs 实例对象上的,而是挂载到 Dayjs 的原型对象上的&#x

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值