我正在尝试覆盖访问localStorage的点表示法。 我已设法覆盖getItem和setItem方法,如下所述:Is it possible to override Local Storage and Session Storage separately in HTML5?
现在我尝试创建一个代理来捕获点访问权限,但是因为我似乎无法覆盖localStorage对象,因为这里尝试了
localStorage = new Proxy(localStorage, {
get: function(target, name) {
if (!(name in target)) {
console.log("Getting non-existent property '" + name + "'");
return undefined;
}
return '123';
},
set: function(target, name, value) {
if (!(name in target)) {
console.log("Setting non-existent property '" + name + "', initial value: " + value);
}
target[name] = value;
}
});
现在,当我尝试它时,我仍然得到测试而不是123:
localStorage.testKey = "test";
alert(localStorage.testKey)
答案 0 :(得分:1)
如果在localStorage上定义getter,它应该可以工作:
Object.defineProperty(window, "localStorage", new (function () {
this.get = function() {
console.log("I'm getting called");
}
})());
答案 1 :(得分:1)
window.localStorage
是一个只读属性,所以你不能像那样重新分配它。
(我建议启用strict mode,这会通过抛出异常提醒您注意这一事实。)
但是,它是可配置的。如果您首先从窗口对象中删除它,您的代码将按预期工作。
var lsProxy = new Proxy(localStorage, {
/* insert descriptor here */
});
delete window.localStorage;
window.localStorage = lsProxy;
您也可以使用Object.defineProperty重新定义它。
Object.defineProperty(window, "localStorage", {
value: lsProxy,
configurable: true,
enumerable: true,
writable: false
});