javascript - 抽象掉 localStorage

标签 javascript html local-storage session-storage

我一直在构建一个 Angular2 库,它为 localStorage 和 sessionStorage 添加了一个抽象层,以添加权限级别和优点等功能。我遇到的问题是,如果其他开发人员尝试直接访问 localStorage 或 sessionStorage,我想抛出错误。确保正确使用权限和其他内容。

所以基本上我想复制 localStorage 和 sessionStorage 引用,然后像这样覆盖它们的函数:

  this.localStorageReference = Object.assign({}, localStorage);
  this.sessionStorageReference = Object.assign({}, sessionStorage);

  const err = "Use the StorageStrategy, not localStorage or sessionStorage.";
  Storage.prototype._setItem = Storage.prototype.setItem;
  Storage.prototype.setItem = function(key, value)
  {
    throw Error(err);
  }

  Storage.prototype._getItem = Storage.prototype.getItem;
  Storage.prototype.getItem = function(key){
    throw Error(err);
  }

哪些覆盖效果很好并抛出错误,问题是 Object.assign 似乎没有复制我需要的内容。因为当我尝试使用引用时,我没有任何方法。

this.localStorageReference.setItem(key, obj);

结果:

TypeError: this.localStorageReference.setItem is not a function

查看 localStorage 文档,我没有看到任何明显的内容。有什么想法吗?

最佳答案

看看 Object.keys(localStorage)。 您会注意到您看不到任何方法名称。与 for (let key in localStorage) 或您愿意尝试的任何其他操作相同。

这些函数不可枚举,或者在原型(prototype)上而不在实例上。无论哪种方式,它们都不会出现在“自己的”键的枚举查找中。

const fakeStorage = ["clear", "setItem", "getItem", "removeItem", /*...*/]
  .map(method => [method, localStorage[method].bind(localStorage)])
  .reduce((obj, [key, value]) => {
    obj[key] = value;
    return obj;
  }, {});

现在我不是通过键进行枚举,而是通过已知的方法名称进行枚举。 另请注意,Storage 的一些实现被构建为防篡改(只读属性;如果该方法不在正确的对象上则抛出错误;等等)。

这引出了一个问题……为什么不只保护您自己的访问权限,而不是强制销毁其他所有人的使用权限?

关于javascript - 抽象掉 localStorage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48177997/

相关文章:

javascript - 通过 React Router v5 处理多种语言的最佳方式是什么?

javascript - knockout.js:更新绑定(bind)?

javascript - javascript JSON 对象中是否存在整数和字符串键的排序?

javascript - 确定 html 标签的内容何时更改

html - 两个 Div 没有并排对齐

javascript - 如何在 Bootstrap 模式上设置本地存储?

JavaScript - 创建一个新方法来查找数组中连续条目的最大总和

javascript - 如何在没有延迟的情况下使用多个选项填充 SELECT 标记?

javascript - 存储用户数据的最佳方式

javascript - Js购物车; localStorage 将我的购物车设置为空