要把一個obj對象存進localStorage,大致步驟是:obj => objStr=JSON.stringify(obj) => localStorage.setItem(name, objStr);
要把一個localStorage取出轉成obj對象,大致步驟是:objStr=localSotrage.getItem(name) => obj = JSON.parse(objStr);
現在看來好像沒什么問題,如果要修改localStorage中保存的obj的某個屬性時,那就要先取出,修改,再存進;這樣一來要寫大量的JSON轉換和localStorage存取代碼,而且還有承擔存取name寫錯的風險。那要解決這個問題,就把自帶方法封裝一下
var wrapJsonStorage = function(name) { var ls = localStorage, lo = ls.getItem(name) || '{}'; try { lo = JSON.parse(lo); //判斷lo是否是對象 lo = Object(lo) === lo ? lo : {}; } catch(e) { lo = {}; } return { has: function(attr) { return !!lo[attr]; }, get: function(attr) { return lo[attr]; }, set: function(attr, val) { lo[attr] = val; return this; }, remove: function(attr) { delete lo[attr]; return this; }, clear: function() { lo = {}; return this; }, save: function() { //lo為空時則刪除localStorage if(this.size() > 0) { ls.setItem(name, JSON.stringify(lo)); } else { ls.removeItem(name); } return this; }, size: function() { return Object.keys(lo).length; }, toJSON: function() { var o = {}, i; for(i in lo) { o[i] = lo[i]; } return o; }, toString: function() { return JSON.stringify(lo); } }; };
使用方法:
注:使用set,remove,clear方法后有調用save方法才會同步到localStorage,主要為了減少io次數,增加效率