本地存储 setItem 覆盖 - 非法调用错误

Posted

技术标签:

【中文标题】本地存储 setItem 覆盖 - 非法调用错误【英文标题】:Local storage setItem override - Illegal invocation error 【发布时间】:2021-10-26 13:20:17 【问题描述】:

我正在尝试覆盖 localStorage.setItem 方法以添加禁用本地存储选项以进行调试。但是我在使用该方法时总是遇到非法调用错误。

let originalFunction = window.Storage.prototype.setItem;
window.Storage.prototype.setItem = (keyName, keyValue) => 
    console.log("Override worked ! ")
    let currentState = localStorage.getItem("disableStorage");
    if (currentState === null || keyName === "disableStorage") 
        originalFunction(keyName, keyValue);
    
    return;

localStorage.setItem("test", "blah");

我做了一个jsfiddle给你测试一下,和sn-p代码一样,本地存储是不行的。

我试过有无窗口,两种情况都行不通。

我们无法在 jsfiddle 中正确看到它,但错误出现在以下行:originalFunction(keyName, keyValue)

我已经完成了与this question 对应的覆盖。但这似乎不起作用。

【问题讨论】:

【参考方案1】:

我找到了问题。 显然,我们需要使用.apply来调用原始方法。

我已经更新了小提琴,所以它现在是工作版本。这是一个用于连贯性的 sn-ps:

let originalFunction = window.Storage.prototype.setItem;
window.Storage.prototype.setItem = function(keyName, keyValue) 
    console.log("Override worked ! ")
    let currentState = localStorage.getItem("disableStorage");
    if (currentState === null || keyName === "disableStorage") 
        originalFunction.apply(this, arguments);
    
    return;

localStorage.setItem("test", "blah");

sn-p 不起作用,但代码可以。

我找到了合成器 here。

【讨论】:

请注意,您已经覆盖了 Storage 方法,但将其与 localStorage 实例耦合。如果您也想覆盖sessionStorage 行为,那么您应该更改为this.getItem。如果你只想影响localStorage,那么你应该覆盖localStorage.setItem

以上是关于本地存储 setItem 覆盖 - 非法调用错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在本地存储中保存对象数组

H5 - 本地数据存储 - localStorage.setItem

html5本地存储api

localStorage本地存储的用法

localStorage

本地存储将数据存储到本地