const deepProxy = (obj, cb) => {
  if (typeof obj === 'object' && obj !== null) {
    for (const prop in obj) {
      console.warn(obj[prop], cb)
      if (typeof obj[prop] === 'object' && obj[prop] !== null) obj[prop] = deepProxy(obj[prop], cb)
    }
  }

  return new Proxy(obj, {
    set: function (target, p, value, receiver) {
      let newValue = value
      if (typeof newValue === 'object' && newValue !== null) {
        newValue = deepProxy(newValue, cb)
      }
      const result = Reflect.set(target, p, newValue, receiver)
      cb()
      return result
    },
    deleteProperty(target, p) {
      delete target[p]
      cb()
    }
  })
}

storage = {
  /**
   * 封装 localStorage 的 setItem,将要储存的数据转化成 JSON
   * 并返回一个深度监听对象,改变这个对象/数组的属性或索引也能同时改变 loacalStorage 储存的 JSON 数据
   * @param {string} key 要设置的 key 值
   * @param {object} val 要设置的 val 值,会转化成 JSON 再储存到本地缓存
   * @returns 返回一个深度监听的 Proxy 对象,更改这个对象将会实时改变本地存储的JSON
   * 示例代码:
   * const user = storage.setLocal('user', {
   *  userName: 'user1234',
   *  psd: 'psd1234'
   * })
   * // 这时候 localStorage 会储存 setLocal 方法的第二个对象转换成的 JSON
   * 
   * user.psd = 'psd4321' // 对 storage.setLocal 返回的对象进行操作会同时改变储存在本地缓存的 JSON
   */
  setLocal(key, val) {
    localStorage.setItem(key, JSON.stringify(val))
    return storage.getLocal(key)
  },

  /**
   * 封装的 localStorage 的 getItem,取出数据前先将 JSON 转化成 Proxy 对象
   * @param {string} key 要取出的本地缓存的 key 值
   * @returns 返回一个深度监听的 Proxy 对象,更改这个对象将会实时改变本地存储的JSON
   * 示例代码:
   * const user = storage.getLocal('user')
   * user.balance = 100 // 同时改变储存在 loaclStorage 的 JSON user 
   */
  getLocal(key) {
    let val = localStorage.getItem(key)
    val = val ? JSON.parse(val) : null
    const proxyObj = deepProxy(val, () => storage.setLocal(key, proxyObj))
    return proxyObj
  },
  
  /**
   * 如果删除 localStorage 中已储存的 JSON (如user) 的某个值(如userName),使用:
   * delete storage.getLocal('user').userName
   * 如果删除 localStorage 的 key (如user),使用 storage.delLocal
   * @param {string} key 要删除的缓存的 key 值
   * 示例代码:
   * storage.delLocal('user') // 删除 key 值为 'user' 的缓存
   */
  delLocal(key) {
    delete storage.getLocal(key)
    localStorage.removeItem(key)
  }
}
// 设置缓存
const user = storage.setLocal('user', {
      name: '占山',
      devices: [5, 4, 3, 2, 1],
      obj:{
         obj:{
            name:'llll'
         }
      }
})
user.name = '',
user.devices = [5,2],
user.obj.obj.name = ''

 

眼睛如果有等级,那么青色一定最高贵,黑色最深邃