覆盖localStorage的点表示法

时间:2015-11-24 08:27:12

标签: javascript html5 local-storage

我正在尝试覆盖访问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)

2 个答案:

答案 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
});