You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 16:37:40