Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 提取本地存储_Javascript_Html_Local Storage_Session Storage - Fatal编程技术网

Javascript 提取本地存储

Javascript 提取本地存储,javascript,html,local-storage,session-storage,Javascript,Html,Local Storage,Session Storage,我一直在构建一个Angular2库,它在localStorage和sessionStorage中添加了一层抽象,以添加权限级别和权限等功能。我遇到的问题是,如果其他开发人员试图直接访问本地存储或会话存储,我希望抛出错误。以确保正确使用权限和其他内容 为此,我希望复制localStorage和sessionStorage引用,然后像这样重写它们的函数: this.localStorageReference = Object.assign({}, localStorage); this.se

我一直在构建一个Angular2库,它在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)
。 您将注意到,您没有看到任何方法名称。对于(输入localStorage),或者任何您想尝试的东西,都可以使用相同的

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

现在我不是枚举键,而是枚举已知的方法名。 还要注意的是,
存储的一些实现是为防篡改而构建的(只读属性;如果方法不在正确的对象上,则抛出错误;等等)


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

setItem
和其他函数可能不可枚举,无法通过
Object.assign()
复制。应该
this.localStorageReference.setItem(key,obj)抛出
错误
?开发人员将如何使用抽象?似乎是个坏主意。如果有人在同一个域上有其他使用存储的应用程序,并且他们想使用您的便利库来实现“超级酷新功能”,但又交叉连接到他们拥有的其他应用程序的数据,该怎么办
const fakeStorage = ["clear", "setItem", "getItem", "removeItem", /*...*/]
  .map(method => [method, localStorage[method].bind(localStorage)])
  .reduce((obj, [key, value]) => {
    obj[key] = value;
    return obj;
  }, {});