Node.js全局变量报错'Uncaught TypeError: "object" is read-only'求助
解决ES模块导出变量无法重新赋值的问题
问题原因
ES模块中通过export let导出的变量,导入后是只读绑定,哪怕原模块里用let声明,也不能直接在导入模块中重新赋值整个变量。你在app.js里尝试把object直接替换成LocalStorage读取的新对象,就触发了这个只读限制,导致报错Uncaught TypeError: "object" is read-only。
解决方案
方案1:修改原对象属性(推荐)
不需要替换整个对象,把LocalStorage里的数据逐个覆盖到原对象的属性上:
修改app.js代码:
import { object } from "./lib/object.mjs"; const savedObject = JSON.parse(localStorage.getItem('Object')); if (savedObject) { object.name = savedObject.name; object.age = savedObject.age; object.score = savedObject.score; }
方案2:导出容器对象
如果需要完全替换整个对象,可以在原模块里导出一个包含目标对象的容器,通过修改容器的属性来替换对象:
修改object.mjs代码:
export const container = { object: createObject() }; function createObject() { return { 'name': undefined, 'age': 0, 'score': 0, } }
修改app.js代码:
import { container } from "./lib/object.mjs"; const savedObject = JSON.parse(localStorage.getItem('Object')); if (savedObject) { container.object = savedObject; }
方案3:导出修改函数
在原模块封装修改逻辑,通过导出的函数来替换对象:
修改object.mjs代码:
let object = createObject(); export function getObject() { return object; } export function setObject(newObj) { object = newObj; } function createObject() { return { 'name': undefined, 'age': 0, 'score': 0, } }
修改app.js代码:
import { setObject } from "./lib/object.mjs"; const savedObject = JSON.parse(localStorage.getItem('Object')); if (savedObject) { setObject(savedObject); }
内容的提问来源于stack exchange,提问作者Cameron Shearer
相关产品推荐
相关产品推荐

