成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面向對象編程: 原生Javascript實現一個支持過期時間的DAO庫

開發 前端
本文主要解決原生localStorage無法設置過期時間的問題,并通過封裝,來實現一個操作便捷,功能強大的localStorage庫,關于庫封裝的一些基本思路和模式,我將采用之前寫的如何用不到200行代碼寫一款屬于自己的js類庫中類似的方法,感興趣的朋友可以學習.

[[358412]]

本文主要解決原生localStorage無法設置過期時間的問題,并通過封裝,來實現一個操作便捷,功能強大的localStorage庫,關于庫封裝的一些基本思路和模式,我將采用之前寫的如何用不到200行代碼寫一款屬于自己的js類庫中類似的方法,感興趣的朋友可以學習,交流。

設計思路


我們將基于localStorage原始api進行擴展,讓其支持失效時間,操作完成后的回調。在文章的最后,我將給出庫的完成代碼,接下來我們就一步步實現吧。

正文

首先,我們來設計庫的基本框架:

  1. const BaseStorage = function(preId, timeSign){ 
  2.   // 初始化一些操作 
  3.  
  4. BaseStorage.prototype = { 
  5.   storage: localStorage || window.localStorage, 
  6.   setfunction(key, value, cb, time){ 
  7.      
  8.   }, 
  9.   get: function(key, cb){ 
  10.      
  11.   }, 
  12.   // 刪除storage,如果刪除成功,返回刪除的內容 
  13.   remove: function(key, cb){ 
  14.     
  15.   } 

如上可以發現,我們的storage會有三個核心api,分別為set,get,remove,我們使用localStorage作為基礎庫支持,當然你也可以將上面的庫換成sessionStorage或者其他。

有了基本骨架,我們就可以實現基本功能的封裝,這里我們先在原型中加一個屬性,來列出數據操作中的各個狀態。

  1. status: { 
  2.  SUCCESS: 0, // 成功 
  3.  FAILURE: 1, // 失敗 
  4.  OVERFLOW: 2, // 數據溢出 
  5.  TIMEOUT: 3  // 超時 
  6. }, 

為了實現過期時間,我們有兩種思路,第一種是先將一個過期時間存到storage中,每次操作都檢查一遍是否過期,但是這種方案意味著對不同的鍵就要設置不同的過期時間的storage與之對應,這樣會占用額外的庫內存,維護起來也不方便。另一種方法就是將過期時間存放到鍵值中,將時間和值通過標識符分隔,每次取的時候從值中截取過期時間,再將真實的值取出來返回,這種方案不會添加額外的鍵值對存儲,維護起來也相對簡單,所以我們采用這種方案。 為了區分不同的庫對象,我們還可以添加鍵前綴,如下:

  1. const BaseLocalStorage = function(preId, timeSign){ 
  2.    this.preId = preId; // 鍵前綴 
  3.    this.timeSign = timeSign || '|-|';  // 過期時間和值的分隔符 
  4.  } 

基于這個思想,我們就可以接下來的實現了。

getKey——修飾key的方法,不影響用戶對真實key的影響

  1. getKey: function(key){ 
  2.      return this.preId + key 
  3.    }, 

set實現

  1. setfunction(key, value, cb, time){ 
  2.      var status = this.status.SUCCESS, 
  3.      key = this.getKey(key); 
  4.      // 設置失效時間,未設置時間默認為一個月 
  5.      try{ 
  6.        time = new Date(time).getTime() || time.getTime(); 
  7.      }catch(e){ 
  8.        time = new Date().getTime() + 1000*60*60*24*31 
  9.      } 
  10.      try{ 
  11.        this.storage.setItem(keytime + this.timeSign + value); 
  12.      }catch(e){ 
  13.        status = this.status.OVERFLOW; 
  14.      } 
  15.      // 操作完成后的回調 
  16.      cb && cb.call(this, status, key, value) 
  17.    } 

get實現

  1. get: function(key, cb){ 
  2.      var status = this.status.SUCCESS, 
  3.      key = this.getKey(key), 
  4.      value = null
  5.      timeSignLen = this.timeSign.length, 
  6.      that = this, 
  7.      index
  8.      time
  9.      result; 
  10.      try{ 
  11.        value = that.storage.getItem(key); 
  12.      }catch(e){ 
  13.        result = { 
  14.          status: that.status.FAILURE, 
  15.          value: null 
  16.        } 
  17.        cb && cb.call(this, result.status, result.value); 
  18.        return result 
  19.      } 
  20.      if(value) { 
  21.        index = value.indexOf(that.timeSign); 
  22.        time = +value.slice(0, index); 
  23.        // 判斷是否過期,過期則清除 
  24.        if(time > new Date().getTime() || time == 0){ 
  25.          value = value.slice(index+timeSignLen); 
  26.        }else
  27.          value = null
  28.          status = that.status.TIMEOUT; 
  29.          that.remove(key); 
  30.        } 
  31.      }else
  32.        status = that.status.FAILURE; 
  33.      } 
  34.      result = { 
  35.        status: status, 
  36.        value: value 
  37.      }; 
  38.      cb && cb.call(this, result.status, result.value); 
  39.      return result 
  40.    } 

remove實現

  1. // 刪除storage,如果刪除成功,返回刪除的內容 
  2.    remove: function(key, cb){ 
  3.      var status = this.status.FAILURE, 
  4.      key = this.getKey(key), 
  5.      value = null
  6.      try{ 
  7.        value = this.storage.getItem(key); 
  8.      }catch(e){ 
  9.        // dosomething 
  10.      } 
  11.      if(value){ 
  12.        try{ 
  13.          this.storage.removeItem(key); 
  14.          status = this.status.SUCCESS; 
  15.        }catch(e){ 
  16.          // dosomething 
  17.        } 
  18.      } 
  19.      cb && cb.call(this, status, status > 0 ? null : value.slice(value.indexOf(this.timeSign) + this.timeSign.length)) 
  20.    } 

在api的實現過程中,由于某種誤操作很可能導致storage報錯,所以建議最好用trycatch包裹,這樣可以避免影響后面的邏輯。

接下來我們可以這么使用:

  1. let a = new BaseStorage('_''@'); 
  2. a.set('name''123'
  3. a.get('name') // {status: 0, value: "123"
  4. // 設置失效時間 
  5. a.set('name''123'null, new Date().getTime() + 1000*60*60*24*31) 
  6. // 移除 
  7. a.remove('name'

完整源碼

  1. /** 
  2.  * 數據管理器 
  3.  */ 
  4. (function(win){ 
  5.   const BaseStorage = function(preId, timeSign){ 
  6.     this.preId = preId; 
  7.     this.timeSign = timeSign || '|-|'
  8.   } 
  9.   
  10.   BaseStorage.prototype = { 
  11.     status: { 
  12.       SUCCESS: 0, 
  13.       FAILURE: 1, 
  14.       OVERFLOW: 2, 
  15.       TIMEOUT: 3 
  16.     }, 
  17.     storage: localStorage || window.localStorage, 
  18.     getKey: function(key){ 
  19.       return this.preId + key 
  20.     }, 
  21.     setfunction(key, value, cb, time){ 
  22.       var status = this.status.SUCCESS, 
  23.       key = this.getKey(key); 
  24.       // 設置失效時間,未設置時間默認為一個月 
  25.       try{ 
  26.         time = new Date(time).getTime() || time.getTime(); 
  27.       }catch(e){ 
  28.         time = new Date().getTime() + 1000*60*60*24*31 
  29.       } 
  30.       try{ 
  31.         this.storage.setItem(keytime + this.timeSign + value); 
  32.       }catch(e){ 
  33.         status = this.status.OVERFLOW; 
  34.       } 
  35.       cb && cb.call(this, status, key, value) 
  36.     }, 
  37.     get: function(key, cb){ 
  38.       var status = this.status.SUCCESS, 
  39.       key = this.getKey(key), 
  40.       value = null
  41.       timeSignLen = this.timeSign.length, 
  42.       that = this, 
  43.       index
  44.       time
  45.       result; 
  46.       try{ 
  47.         value = that.storage.getItem(key); 
  48.       }catch(e){ 
  49.         result = { 
  50.           status: that.status.FAILURE, 
  51.           value: null 
  52.         } 
  53.         cb && cb.call(this, result.status, result.value); 
  54.         return result 
  55.       } 
  56.       if(value) { 
  57.         index = value.indexOf(that.timeSign); 
  58.         time = +value.slice(0, index); 
  59.         if(time > new Date().getTime() || time == 0){ 
  60.           value = value.slice(index+timeSignLen); 
  61.         }else
  62.           value = null
  63.           status = that.status.TIMEOUT; 
  64.           that.remove(key); 
  65.         } 
  66.       }else
  67.         status = that.status.FAILURE; 
  68.       } 
  69.       result = { 
  70.         status: status, 
  71.         value: value 
  72.       }; 
  73.       cb && cb.call(this, result.status, result.value); 
  74.       return result 
  75.     }, 
  76.     // 刪除storage,如果刪除成功,返回刪除的內容 
  77.     remove: function(key, cb){ 
  78.       var status = this.status.FAILURE, 
  79.       key = this.getKey(key), 
  80.       value = null
  81.       try{ 
  82.         value = this.storage.getItem(key); 
  83.       }catch(e){ 
  84.         // dosomething 
  85.       } 
  86.       if(value){ 
  87.         try{ 
  88.           this.storage.removeItem(key); 
  89.           status = this.status.SUCCESS; 
  90.         }catch(e){ 
  91.           // dosomething 
  92.         } 
  93.       } 
  94.       cb && cb.call(this, status, status > 0 ? null : value.slice(value.indexOf(this.timeSign) + this.timeSign.length)) 
  95.     } 
  96.   } 
  97.   
  98.   win.BS = BaseStorage; 
  99. })(window) 
  100.   

 

 

責任編輯:姜華 來源: 趣談前端
相關推薦

2011-05-25 10:21:44

Javascript

2012-01-17 09:34:52

JavaScript

2017-04-21 09:07:39

JavaScript對象編程

2012-02-27 09:30:22

JavaScript

2011-05-25 10:59:26

Javascript繼承

2011-05-25 11:15:02

Javascript繼承

2010-10-08 09:13:15

oop模式JavaScript

2011-06-28 14:11:33

JavaScript

2023-02-22 18:06:35

函數javascript面向對象編程

2011-05-13 09:58:46

javascript

2021-10-21 18:47:37

JavaScript面向對象

2017-07-27 08:56:59

javascriptJavaWeb

2019-11-18 17:05:02

JavaScript面向對象程序編程Java

2023-04-19 08:43:52

Python面向對象編程

2021-10-20 18:44:43

編程對象JavaScript

2015-05-25 15:06:28

JavaScript函數式編程

2022-08-15 15:39:23

JavaScript面向對象數據

2014-02-14 09:37:01

JavascriptDOM

2013-07-30 09:42:41

實現編程接口編程對象編程

2018-09-18 10:11:21

前端vue.jsjavascript
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩欧美国产精品 | 日韩免费av一区二区 | 国产成人精品一区二 | 日韩国产一区二区 | 欧美日韩国产中文 | 2022精品国偷自产免费观看 | 欧美性另类 | 日韩一区二区三区在线播放 | 国产一级视频在线播放 | 一区免费观看 | 午夜影院 | 亚洲欧美第一视频 | 久久久精品影院 | 久久精品国产免费一区二区三区 | 精品国产乱码一区二区三区a | 国产在线视频在线观看 | 亚洲高清免费视频 | 国产精品视频免费看 | 欧美视频网 | 久久综合久久久 | 日本三级电影免费 | 日韩中文不卡 | 中文字幕成人 | 久久99精品国产自在现线小黄鸭 | 三级黄色片在线 | 欧美性久久 | 黄色91在线 | 一级免费视频 | 高清国产一区二区 | 久草视频在线播放 | 激情麻豆视频 | 91在线导航| 99精品视频在线观看免费播放 | 久久综合九色综合欧美狠狠 | 在线成人www免费观看视频 | 欧美激情在线一区二区三区 | 午夜免费观看 | 美女国产一区 | 中文字幕久久精品 | 日韩成人在线视频 | 国产精品一区久久久 |