Javascript 重写本地存储的点表示法

Javascript 重写本地存储的点表示法,javascript,html,local-storage,Javascript,Html,Local Storage,我试图覆盖访问本地存储的点符号。 我已经成功覆盖了getItem和setItem方法,如下所述: 现在,我尝试创建一个代理来捕获点访问,但是因为我似乎无法像这里尝试的那样覆盖localStorage对象 localStorage = new Proxy(localStorage, { get: function(target, name) { if (!(name in target)) { console.log("Getting non-existent prope

我试图覆盖访问本地存储的点符号。 我已经成功覆盖了getItem和setItem方法,如下所述:

现在,我尝试创建一个代理来捕获点访问,但是因为我似乎无法像这里尝试的那样覆盖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)

如果在localStorage上定义getter,它应该可以工作:

Object.defineProperty(window, "localStorage", new (function () {
    this.get = function() {
      console.log("I'm getting called");
    }
})());
是一个只读属性,因此不能像那样重新分配它

(我建议打开,它会通过抛出异常来提醒您这一事实。)

但是,它是可配置的。如果先从窗口对象中删除它,代码将按预期工作

var lsProxy = new Proxy(localStorage, {
    /* insert descriptor here */
});

delete window.localStorage;
window.localStorage = lsProxy;
您还可以使用重新定义它


代理对象不能与它虚拟化的对象同名。实际上,还没有调用您的
get
/
set
方法。尝试添加
控制台。在每个方法中记录
调用(在
之外,如果
),您会看到。我知道我的方法没有被调用,问题是是否有任何方法可以调用它们。是否有任何方法可以调用它们。为代理对象使用不同的名称/标识符(除了
localStorage
之外的所有内容)。
Object.defineProperty(window, "localStorage", {
    value: lsProxy,
    configurable: true,
    enumerable: true,
    writable: false
});