0Pricing
JavaScript Academy · 课时

安全合并对象;冻结与封闭

在合并对象时避免意外,防止原型污染,并使用 Object.freeze 和 Object.seal 保护数据

安全合并对象;冻结与封闭 是 CoddyKit 上的免费 JavaScript Academy 课时。 这是第 2 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 JavaScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 JavaScript Academy 课程共包含 3 节课。

为什么要安全合并

目标:安全地合并数据并保护状态。

  • 使用展开语法或Object.assign进行浅合并
  • 通过过滤键来避免原型污染
  • 使用Object.create(null)作为安全目标
  • 使用freeze和seal锁定对象
安全合并对象;冻结与封闭 — 插图 1

浅合并(展开语法)

请使用展开语法(或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);
安全合并对象;冻结与封闭 — 插图 2

避免原型污染

键来自外部时,请编写一个小型的允许列表/拒绝列表,并使用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);
安全合并对象;冻结与封闭 — 插图 3

克隆并赋值

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);
安全合并对象;冻结与封闭 — 插图 4

冻结与封闭

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);
安全合并对象;冻结与封闭 — 插图 5

安全合并习惯

提示:

  • 优先创建新对象:{...a, ...b}或Object.assign({}, a, b)。
  • 对于不受信任的键:使用Object.create(null),并跳过__proto__、prototype和constructor。
  • 使用Object.freeze保护配置,使用Object.seal防护模型。
安全合并对象;冻结与封闭 — 插图 6

原型污染基础测验

快速检查:不受信任的合并操作最安全的目标。

安全合并对象;冻结与封闭 — 插图 7

总结

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

安全合并对象;冻结与封闭 — 插图 8

常见问题解答

「安全合并对象;冻结与封闭」课时是免费的吗?

是的 — 「安全合并对象;冻结与封闭」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 输入验证与转义基础
  2. 安全合并对象;冻结与封闭
  3. 错误边界(概念)——不使用框架
← 返回 JavaScript Academy