原型对象不能直接存入localStorage,因其含函数、getter/setter、Symbol等JSON不支持项,且JSON.stringify仅序列化实例自身可枚举属性;应存储实例数据,读取后用构造函数重建。

原型对象本身不能直接序列化保存到 localStorage,因为 localStorage 只接受字符串值,而原型(如 `Object.prototype`、自定义构造函数的 `prototype`)是不可枚举的、非自有属性的集合,且包含函数、访问器、内部方法等——这些在 JSON 序列化中会被自动忽略或抛错。
为什么不能直接存原型对象
JSON.stringify() 会跳过以下内容:
- 函数(methods)、getter/setter 属性
- undefined、Symbol 类型的键或值
- 原型链上的属性(只处理对象自身的可枚举属性)
- Date、RegExp、Map、Set 等内置对象会变成空对象或报错
实际能存的,是“基于原型创建的实例对象”
你真正需要持久化的,通常不是原型本身,而是用该原型构造出来的具体实例。例如:
function User(name, role) {
this.name = name;
this.role = role;
}
User.prototype.sayHello = function() {
return `Hi, I'm ${this.name}`;
};
const u = new User("李四", "editor");
// ✅ 可以存这个实例(不含 sayHello 方法)
localStorage.setItem("user", JSON.stringify(u));
// ❌ 不能存 User.prototype —— 它不是普通数据对象
如果非要记录原型结构,得手动提取有用信息
比如你想备份类的字段定义或默认配置,可以单独设计一个“元描述”对象来存:
- 只存原型上定义的默认值(如
User.defaults = { role: "user" }) - 用
Object.getOwnPropertyDescriptors()提取自有属性描述符(不含方法) - 把关键字段名、类型提示、校验规则等结构化为纯 JSON 兼容对象再保存
安全读取并重建实例的建议
存的时候只保留数据;取出来后,再用原构造函数“复活”为实例:
- 存储:只序列化实例自身属性 →
JSON.stringify(u) - 读取:
JSON.parse(localStorage.getItem("user"))得到普通对象 - 重建:
Object.assign(new User(), parsedData)或用解构 + 构造函数参数


















