JSON拷贝在Mock引擎中不可靠:函数消失、内置对象类型丢失、循环引用报错、undefined/Symbol/BigInt被静默丢弃;应采用Object.freeze递归冻结、structuredClone克隆或服务端Mock隔离。

JSON 方法不能真正解决 Mock 引擎中原始模板被篡改的风险,反而可能掩盖问题、引入新隐患。它看似“隔离”了数据,实则在关键场景下完全失效。
JSON 拷贝在 Mock 场景中根本不可靠
Mock 引擎常需复用同一份模板(如 userTemplate)生成多条响应数据。若直接用 JSON.parse(JSON.stringify(template)) 拷贝,以下情况会立刻崩塌:
-
模板含函数或方法时,拷贝后函数消失:比如模板里有
generateId: () => Date.now(),序列化后变成undefined,后续调用报错 - 含 Date、RegExp、Map、Set 等内置对象时,类型丢失:日期变成字符串,正则变为空对象,Map 变成普通空对象,导致 mock 数据结构失真
-
模板存在循环引用(如父子关系、树形结构)时,直接抛错:
TypeError: cyclic object value,Mock 请求直接失败 -
含
undefined、Symbol、BigInt字段时,这些值被静默丢弃,导致字段缺失却不报警
真正安全的 Mock 模板隔离策略
要杜绝原始模板被污染,核心不是“深拷贝”,而是“不可变性保障”和“运行时隔离”:
-
模板定义即冻结:创建模板后立即执行
Object.freeze(template),并递归冻结所有嵌套对象(可用工具函数封装),阻止任何属性修改 -
使用结构化克隆(structuredClone)替代 JSON:现代浏览器已支持
structuredClone(template),能保留 Date、Map、Set、RegExp、BigInt 等类型,且自动处理循环引用(不抛错) -
Mock 响应构造阶段才生成数据,不提前拷贝模板:把模板当作纯配置,每次请求时用函数动态生成响应体(如
createUserResponse(template, overrides)),避免中间态对象长期持有 - 服务端 Mock 层统一接管(推荐):前端只发标准请求,由本地 Mock 服务(如 MSW、MirageJS 或自建 Express 中间件)读取模板、生成响应并返回——原始模板从不进入前端 JS 执行上下文
如果必须用 JSON 方案,至少加三道防护
仅当兼容老浏览器且模板极其简单(纯 JSON-safe 数据)时,可谨慎使用,但必须补足缺陷:
立即学习“前端免费学习笔记(深入)”;
- 校验模板合法性:在 Mock 初始化时遍历模板,检查是否含函数、Date、undefined 等非法值,发现即报错提示
-
手动补全关键类型:对已知字段做后处理,例如检测到
template.createdAt === "2026-04-30T20:18:00.000Z",则还原为new Date(...) -
响应层防御性复制:不在模板层拷贝,而是在最终返回前对生成的响应对象做浅拷贝(
{...response}),防止下游误改——这虽非深拷贝,但足够拦截常见篡改


















