我一直在构建一个 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/