前言
? ? 去年就已經(jīng)開發(fā)并應用大半年了,但是最近又被提出優(yōu)化項,故趁此機會完整記錄下

分析
? ? 過期時間的比較可以在獲取時,當過期時直接刪除
? ? 可以借助Reflect.defineProperty設置get為每一次訪問做攔截,并在此做過期校驗
? ? 為了保證數(shù)據(jù)的"干凈",將過期時間單獨保存起來,并去監(jiān)聽瀏覽器的刷新事件,在發(fā)生刷新行為后,存儲過期時間,并在下次重新實例化時從localStorage中獲取,并根據(jù)過期時間重新校驗一次,這樣配合每次校驗的能力,就不需要設置定時器了
實現(xiàn)
? ??初始化
? ? ? ? 我個人是傾向于全局統(tǒng)一的,所以一開始是做成了單例模式,但是后續(xù)使用過程中發(fā)現(xiàn)都不這么用,故去除了
? ? ? ? 初始化主要就是生產(chǎn)一個根命名作為store,并注冊瀏覽器的beforeunload事件將過期信息保存后讀取到該信息做一遍過期校驗以省略定時器的使用

? ??設置(可批量)
? ? ? ? 這里主要就是做一些參數(shù)處理,比如對批量時接收對象,非批量接收對象合并成數(shù)組,根據(jù)是否提供name屬性決定設置的值是在命名下的對象下還是直接掛在命名下

? ? def方法則是為過期時間設置校驗攔截

? ??clear、getItem、removeItem
? ? ? ? 均要支持僅清空當前命名空間下的值或清空所有


? ??過期時間也要支持單獨設置

使用

? ??存儲效果

寫在最后
? ? 一開始在未摒棄定時器的情況下,我的思路是監(jiān)聽瀏覽器刷新,本地存儲已經(jīng)過的時間,當刷新后計算差值時間后重新設置定時器,然后通過如下偽代碼獲取所有key后遍歷由redis控制的部分并校驗過期
