如何存储恢复Object.create(null)创建的null原型对象?解析时能否指定原型?
null原型对象的存储恢复与JSON解析问题解答
问题1:如何将使用Object.create(null, {...})创建的null原型对象存储到数据库并恢复?
要完整还原这类对象(包括原型为null、属性的writable/enumerable等特性),不能直接用JSON.stringify()存对象本身——因为JSON仅保留属性键值对,会丢失原型信息和属性描述符。正确做法是存储对象的属性描述符,步骤如下:
- 用
Object.getOwnPropertyDescriptors()获取对象的完整属性描述符 - 将描述符序列化为JSON字符串存入数据库
- 恢复时解析JSON得到描述符,再通过
Object.create(null, 描述符)重建对象
示例代码:
// 原null原型对象 const nullObj = Object.create(null, { a: { value: 10, writable: true }, b: { value: 'Text' } }); // 1. 获取属性描述符并序列化 const storedDescriptors = Object.getOwnPropertyDescriptors(nullObj); const storedStr = JSON.stringify(storedDescriptors); // 模拟从数据库取出解析 const retrievedDescriptors = JSON.parse(storedStr); // 2. 重建null原型对象 const restObj = Object.create(null, retrievedDescriptors); // 验证属性特性:a可修改,b不可修改(非严格模式下静默失败) restObj.a = 12; restObj.b = "New text"; console.log(restObj); // 输出 {}(null原型对象无toString方法,控制台显示为空但属性实际存在) console.log(`${restObj.a} ${restObj.b}`); // 输出 12 Text
注意:严格模式下修改不可写属性b会直接抛出错误,非严格模式仅静默失败。
问题2:若仅给定字符串化后的对象,能否将其解析为具有指定原型的对象?
可以解析为指定原型的对象,但无法完全还原原对象的属性特性——因为JSON字符串仅保存属性键值,丢失了writable/enumerable等描述符信息。具体步骤:
- 用
JSON.parse()解析字符串得到普通对象(原型为Object.prototype) - 创建目标原型的空对象(比如
Object.create(null)) - 将解析得到的属性复制到新对象中
示例代码:
const jsonStr = '{"a":10,"b":"Text"}'; // 解析得到普通对象 const parsedObj = JSON.parse(jsonStr); // 创建null原型对象并复制属性 const nullProtoObj = Object.create(null); Object.assign(nullProtoObj, parsedObj); // 验证:原型为null,但所有属性默认可写 console.log(Object.getPrototypeOf(nullProtoObj)); // 输出 null nullProtoObj.b = "New text"; console.log(nullProtoObj.b); // 输出 New text(与原对象中b不可写的特性不同)
这种方式仅能恢复属性值,若需完整还原对象,必须存储属性描述符而非单纯的JSON键值对。
内容的提问来源于stack exchange,提问作者Gary
相关产品推荐
相关产品推荐

