Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Chrome 86:TypeError:不允许访问器属性_Javascript_Google Chrome_Accessor - Fatal编程技术网

Javascript Chrome 86:TypeError:不允许访问器属性

Javascript 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

我定义了一个属性访问器,它在Chrome
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
陷阱提供处理程序