㈠ dayjs源碼解析(二):Dayjs 類
上篇文章講述了dayjs的基礎知識、locale、constant和utils,本文將繼續深入解析dayjs的核心部分——src/index.js中的Dayjs類。
src/index.js文件結構清晰,按照以下步驟構建:
然而,這里存在兩個疑問,可能是為了縮減代碼體積,由@iamkun提出。
現在開始正式分析代碼。
locale相關全局定義
首先默認導入了locale/en.js英文的locale,然後使用L存儲當前使用的locale名字,使用Ls(locale Storage)存儲locale對象。
工具補充
定義了一個工具方法parseLocale。這個方法處理以下幾種情況:
然後將定義好的parseLocale方法補充到Utils中。
相關方法
在Dayjs類中,關於locale的方法有兩個,實例私有方法$locale用來返回當前使用的locale對象;實例方法locale本質上就是調用了parseLocale方法,但最後返回的是新的改變了locale的Dayjs實例。
注意:在dayjs中,許多操作都使用clone()方法來返回新的Dayjs實例,這也是這個庫的優點之一。
最後同樣將parseLocale方法補充到Dayjs類的靜態方法中。
補充Utils
上一節和前文中已經分析了一些Util工具,這里將其補充完整:
注意:這些工具方法沒有統一定義在utils.js文件中的原因是用到了index.js作用域中的一些變數。
需要特別關注的是wrapper方法,在Dayjs類中大量應用了該方法,其實是通過date和原實例封裝了一個新實例,新實例和原實例的主要區別就是關聯的時間不同。
Dayjs類
Dayjs類是整個dayjs庫的核心,可以給其定義的實例方法分類,也可以查看官網的文檔分類。
解析都寫在了代碼的注釋里:
原型鏈
通常來說,定義在實例中的方法應該在原型鏈上,但有幾個與時間有關的setter/getter方法相似,所以單獨將原型鏈寫在了上面。
這幾個方法都是不傳參數時為getter,傳參數時為setter。
靜態屬性
還有一些方法和屬性掛在了dayjs函數對象上,最核心的是載入插件和載入locale的方法,幾個方法的用法都能在官方文檔中找到。
如果對dayjs函數對象、Dayjs類和原型的關系感到困惑,可以參考下圖,最後形成的關系如下圖所示:
總結
如果不看插件部分,dayjs庫的核心已經解析完成,看一下默認生成dayjs實例長什麼樣子:
實例本身的屬性是一些與時間相關的屬性,各種操作方法都在原型__proto__上。
本節結束,下一節將開始解析dayjs的插件。
㈡ 如何實現JS的靜態變數效果,多頁面引用一個JS,共享變數或對象值
這樣做法其實是有兩個不同的comm.js。a界面引用的comm.js,與b界面引用的comm.js雖然是相同的文件,但是在兩個頁面是不會共享內存的把。
㈢ nodejs通過函數名進行靜態方法調用出現類型錯誤,為什麼
在JS里,一切都是對象,所謂的class並不是傳統語言上的定義或者聲明,而是直內接創建出來了(容已分配內存)。
Myfunc是個構造函數(constructor),所有在構造函數中創建的變數和方法都是prototype的。
因此
function Myfunc(){
this.myMethod=function(){
}
}
和
function Myfunc(){
}
Myfunc.prototype.myMethod=function(){
}
是等效的。
所以調用前必須new一下。
而下面這段是可以的,因為直接給Myfunc對象加了一個方法myMethod。恩只是寫法和用法像靜態而已。
function Myfunc(){
}
Myfunc.myMethod=function(){
}