上一篇 dayjs 源碼解析(四)(Dayjs 類)介紹了 dayjs 的源碼目錄結構。接下來,本篇將分析一下 dayjs 中插件功能的用法、源碼以及如何編寫本身的 dayjs 插件。javascript
dayjs 的插件,經過掛載到 dayjs 函數下的 extend 函數加載,而後使用:java
import plugin // 導入插件 dayjs.extend(plugin) // 加載插件 dayjs.extend(plugin, options) // 或者加載插件的同時,加入插件所須要的參數
例子:使用官方的 IsLeapYear 插件segmentfault
import isLeapYear from 'dayjs/plugin/isLeapYear' dayjs.extend(isLeapYear) dayjs('2000-01-01').isLeapYear() // true
這就是 dayjs 插件的使用方法。api
// 擴展插件的方法 // plugin:插件函數 // option:插件的選項 dayjs.extend = (plugin, option) => { // 插件函數接受三個參數 // 1.插件選項 2.Dayjs 類 3.dayjs 函數 // 插件的方法都是掛載在 Dayjs 類的原型對象上的(Dayjs.prototype)。 plugin(option, Dayjs, dayjs) return dayjs }
dayjs.extend() 方法,接受兩個參數,即插件(函數)和插件的選項。函數
在 dayjs.extend() 方法中,直接調用傳入的插件(函數),且傳入三個參數:傳入 dayjs.extend() 方法的 option、Dayjs 類以及 dayjs 函數。this
最後,返回 dayjs 函數。prototype
而後,咱們來看一個官方的 isLeapYear 插件的源碼,看看它是怎麼寫的:插件
export default (o, c) => { const proto = c.prototype proto.isLeapYear = function () { return ((this.$y % 4 === 0) && (this.$y % 100 !== 0)) || (this.$y % 400 === 0) } }
在 isLeapYear 插件源碼中,導出一個函數,該函數接受兩個參數(即在 dayjs.extend() 方法中的 option 和 Dayjs 類),而後將 isLeapYear 函數掛載到 Dayjs 類的原型對象上。所以,每一個 Dayjs 實例均可以使用 isLeapYear 方法。code
經過閱讀插件的源碼,咱們知道了插件的方法,能夠掛載到 Dayjs 類上、Dayjs 類原型上以及 dayjs 函數對象上。而且,能夠經過插件選項(option),來對插件進行配置。
官方文檔也提供了插件開發的模板:orm
export default (option, dayjsClass, dayjsFactory) => { // 擴展 dayjs() 實例 // 例:添加 dayjs().isSameOrBefore() 實例方法 dayjsClass.prototype.isSameOrBefore = function (arguments) {} // 擴展 dayjs 類 // 例:添加 dayjs.utc() 類方法 dayjsFactory.utc = (arguments) => {} // 覆蓋已存在的 API // 例:擴展 dayjs().format() 方法 const oldFormat = dayjsClass.prototype.format dayjsClass.prototype.format = function (arguments) { // 原始format結果 const result = oldFormat(arguments) // 返回修改後結果 } }
經過插件,能夠很方便的進行 dayjs 庫的方法的擴展,來更好的服務咱們的具體的業務需求。
dayjs 源碼解析完。這五篇文章,也只是大概的解析了一下 dayjs 源碼的主要函數、方法和類,其餘 api 方法還須要本身一個一個去看。☺
如何閱讀源碼?