localStorage`中的同一键(key)做数据隔离

61 阅读1分钟

localStorage中的同一键(key)做数据隔离

主要思路其实都是为这个同一的键添加不一样的前缀去实现这个不同的用户的隔离

主要思路可以是

1. 封装存储对象

创建一个封装的对象,该对象内部管理所有键值对,并提供一套API来访问这些数据。

示例代码:

const isolatedStorage = (function() {
  const data = {};
​
  function setItem(key, value) {
    data[key] = value;
  }
​
  function getItem(key) {
    return data[key];
  }
​
  function removeItem(key) {
    delete data[key];
  }
​
  // 公开API
  return {
    setItem,
    getItem,
    removeItem
  };
})();
​
// 使用
isolatedStorage.setItem('userProfile', { name: 'Alice' });
console.log(isolatedStorage.getItem('userProfile'));
isolatedStorage.removeItem('userProfile');

2. 使用命名空间对象

创建一个命名空间对象,所有相关数据都存储在这个对象内。

示例代码:

const appData = {};
​
// 存储用户信息
appData.userProfile = {
  set(name, value) {
    localStorage.setItem(`userProfile_${name}`, JSON.stringify(value));
  },
  get(name) {
    const value = localStorage.getItem(`userProfile_${name}`);
    return value ? JSON.parse(value) : null;
  },
  remove(name) {
    localStorage.removeItem(`userProfile_${name}`);
  }
};
​
// 使用
appData.userProfile.set('Alice', { age: 25 });
console.log(appData.userProfile.get('Alice'));
appData.userProfile.remove('Alice');

3. 数据版本控制

在数据存储时加入版本控制,每次数据更新时增加版本号。

示例代码:

let version = 1;
​
function setData(key, value) {
  localStorage.setItem(`${key}_${version}`, JSON.stringify(value));
}
​
function getData(key) {
  const value = localStorage.getItem(`${key}_${version}`);
  return value ? JSON.parse(value) : null;
}
​
function clearData(key) {
  localStorage.removeItem(`${key}_${version}`);
}
​
// 使用
setData('settings', { theme: 'light' });
console.log(getData('settings'));
clearData('settings');

4. 利用闭包隔离数据

使用闭包来创建一个私有的数据存储空间。

示例代码:

const dataIsolation = (function() {
  let privateData = {};
​
  return {
    set(key, value) {
      privateData[key] = value;
    },
    get(key) {
      return privateData[key];
    },
    remove(key) {
      delete privateData[key];
    }
  };
})();
​
// 使用
dataIsolation.set('secretKey', 'superSecretValue');
console.log(dataIsolation.get('secretKey'));
dataIsolation.remove('secretKey');

注意事项

  • 所有这些方法都避免了直接使用全局localStorage,从而减少了潜在的数据冲突。
  • 封装和闭包方法实际上并不使用localStorage,它们提供了一种完全隔离的存储方式,但失去了localStorage跨会话持久存储数据的优势。
  • 命名空间对象和数据版本控制方法仍然使用localStorage,但通过特定的命名约定来避免不同部分的数据相互干扰。

选择哪种方法取决于你的具体需求和偏好。在某些情况下,可能需要结合使用这些策略来达到最佳的数据隔离效果。