本地存储 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 覆盖 - 非法调用错误的主要内容,如果未能解决你的问题,请参考以下文章