安全合并对象;冻结与封闭
在合并对象时避免意外,防止原型污染,并使用 Object.freeze 和 Object.seal 保护数据
安全合并对象;冻结与封闭 是 CoddyKit 上的免费 JavaScript Academy 课时。 这是第 2 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 JavaScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 JavaScript Academy 课程共包含 3 节课。
为什么要安全合并
目标:安全地合并数据并保护状态。
- 使用展开语法或Object.assign进行浅合并
- 通过过滤键来避免原型污染
- 使用Object.create(null)作为安全目标
- 使用freeze和seal锁定对象

浅合并(展开语法)
请使用展开语法(或Object.assign({}, a, b))创建新对象;不要修改输入。
// Shallow merge with spread keeps sources unchanged
const a = { x: 1, y: 2 };
const b = { y: 9, z: 3 };
// Later keys win on conflicts
const merged1 = { ...a, ...b };
console.log("a:", a);
console.log("b:", b);
console.log("merged1:", merged1);

避免原型污染
键来自外部时,请编写一个小型的允许列表/拒绝列表,并使用Object.create(null)作为目标。
// Avoid prototype pollution: use a null-prototype target and skip special keys
function safeMergeUntrusted(pairs) {
// target has no prototype
const out = Object.create(null);
// keys to skip
const BLOCK = new Set(["__proto__", "prototype", "constructor"]);
for (const [k, v] of pairs) {
if (typeof k !== "string") continue;
if (BLOCK.has(k)) continue;
out[k] = v;
}
return out;
}
const inputPairs = [
["name", "Ayla"],
["__proto__", { hacked: true }],
["role", "user"]
];
const safe = safeMergeUntrusted(inputPairs);
console.log("safe.name:", safe.name);
console.log("safe.role:", safe.role);
console.log("safe.__proto__ is undefined?", safe.__proto__ === undefined);

克隆并赋值
Object.assign({}, ...)是一种安全且便于初学者阅读的模式。
// Object.assign can also create a new object
const base = { a: 1, b: 2 };
const patch = { b: 5 };
// New object as first arg → sources untouched
const merged2 = Object.assign({}, base, patch);
console.log("base:", base);
console.log("patch:", patch);
console.log("merged2:", merged2);

冻结与封闭
freeze会阻止所有更改;seal会阻止添加和删除,但允许更新现有属性。
// Freeze: no add/remove/change
const frozen = Object.freeze({ id: 1, tag: "locked" });
// Seal: no add/remove, but you may change existing values
const sealed = Object.seal({ id: 2, tag: "open" });
// Attempts (silently fail in non-strict mode)
frozen.tag = "new";
sealed.tag = "updated";
sealed.newKey = 123;
console.log("frozen:", frozen);
console.log("sealed:", sealed);

安全合并习惯
提示:
- 优先创建新对象:{...a, ...b}或Object.assign({}, a, b)。
- 对于不受信任的键:使用Object.create(null),并跳过__proto__、prototype和constructor。
- 使用Object.freeze保护配置,使用Object.seal防护模型。

原型污染基础测验
快速检查:不受信任的合并操作最安全的目标。

总结
总结:通过创建新对象来合并数据,过滤不受信任的键,并使用freeze/seal保护重要的数据结构。

常见问题解答
「安全合并对象;冻结与封闭」课时是免费的吗?
是的 — 「安全合并对象;冻结与封闭」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 JavaScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 JavaScript Academy 课程共包含 3 节课。
「安全合并对象;冻结与封闭」这节课中我会学到什么?
在合并对象时避免意外,防止原型污染,并使用 Object.freeze 和 Object.seal 保护数据 你通过在浏览器中直接运行的动手代码来练习 JavaScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 JavaScript Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 JavaScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 3 节。
「安全合并对象;冻结与封闭」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 JavaScript Academy 课中编写并运行代码吗?
能。每节 JavaScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 输入验证与转义基础
- 安全合并对象;冻结与封闭
- 错误边界(概念)——不使用框架