Javascript Chrome 86:TypeError:不允许访问器属性
我定义了一个属性访问器,它在ChromeJavascript Chrome 86:TypeError:不允许访问器属性,javascript,google-chrome,accessor,Javascript,Google Chrome,Accessor,我定义了一个属性访问器,它在Chrome86.0.4240.80版(正式版本)(x86_64)更新之前就可以使用 const newSetItem = (x, y) => { sessionStorage.setItem(`custom_${x}`, y) } Object.defineProperty(localStorage, 'setItem', {get: newSetItem, configurable: true, writeable: true}) 此外,这在Fi
86.0.4240.80版(正式版本)(x86_64)
更新之前就可以使用
const newSetItem = (x, y) => {
sessionStorage.setItem(`custom_${x}`, y)
}
Object.defineProperty(localStorage, 'setItem', {get: newSetItem, configurable: true, writeable: true})
此外,这在Firefox和Edge以及Chrome 85中也能正常工作
现在它抛出:
TypeError: Accessor properties are not allowed.
这是最新Chrome版本的一项功能还是有问题?您试图将主机提供的外来对象(
localStorage
)的标准方法(setItem
)转换为访问器属性设置器方法。即使成功了,这也是一个非常糟糕的主意。(还要注意,setter方法只接受一个参数,而不是两个。)
如果您的目标是在localStorage
中设置内容,那么最简单的方法是将localStorage
全局指向sessionStorage
。您无法分配给它(它是只读的),但可以重新配置它:
Object.defineProperty(window, "localStorage", {
value: sessionStorage,
configurable: true
});
(如果您可以确保没有任何代码使用window.localStorage.setItem(…)
而不仅仅是localStorage.setItem(…)
,那么让localStorage=sessionStorage;也可以工作,但您可能无法做出这样的假设。)
不过,我不建议这样做。我会尽我所能将写入要求改为localStorage
写入sessionStorage
。但如果你不能,那你就这么做
如果您不想让它们像那样等价,那么您必须做同样的事情,用代理对象替换localStorage
。它必须是代理的原因是localStorage
和sessionStorage
不仅通过setItem
和getItem
提供对项目的访问,还提供作为属性的命名访问(例如,localStorage.foo=“bar”
)。在JavaScript中模拟通配符访问器属性的唯一方法是使用代理对象,该对象为get
和set
/defineProperty
陷阱提供处理程序