Javascript 提取本地存储
我一直在构建一个Angular2库,它在localStorage和sessionStorage中添加了一层抽象,以添加权限级别和权限等功能。我遇到的问题是,如果其他开发人员试图直接访问本地存储或会话存储,我希望抛出错误。以确保正确使用权限和其他内容 为此,我希望复制localStorage和sessionStorage引用,然后像这样重写它们的函数: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
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;
}, {});