0Pricing
JavaScript Academy · บทเรียน

การผสานออบเจ็กต์อย่างปลอดภัย การแช่แข็งและการผนึก

ผสานออบเจ็กต์โดยไม่เกิดเรื่องไม่คาดคิด หลีกเลี่ยงการปนเปื้อนต้นแบบ และปกป้องข้อมูลด้วย Object.freeze กับ Object.seal

การผสานออบเจ็กต์อย่างปลอดภัย การแช่แข็งและการผนึก เป็นบทเรียน JavaScript Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน JavaScript Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส JavaScript Academy มีบทเรียนทั้งหมด 3 บทเรียน

เหตุใดจึงต้องผสานอย่างปลอดภัย

เป้าหมาย: ผสานข้อมูลอย่างปลอดภัยและปกป้องสถานะ

  • ผสานแบบตื้นด้วยการกระจายหรือ Object.assign
  • หลีกเลี่ยงการทำให้ prototype ปนเปื้อนด้วยการกรองคีย์
  • ใช้ 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

ป้องกันการทำให้ prototype ปนเปื้อน

เมื่อคีย์มาจากภายนอก ให้เขียนรายการที่อนุญาต/รายการที่ปฏิเสธขนาดเล็ก และใช้ 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

โคลนและ assign

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 จะป้องกันการเปลี่ยนแปลงทั้งหมด ส่วน 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

แบบทดสอบพื้นฐานการทำให้ prototype ปนเปื้อน

ตรวจสอบอย่างรวดเร็ว: เป้าหมายที่ปลอดภัยที่สุดสำหรับการผสานข้อมูลที่ไม่น่าไว้วางใจ

การผสานออบเจ็กต์อย่างปลอดภัย การแช่แข็งและการผนึก — ภาพประกอบ 7

ทบทวน

ทบทวน: ผสานข้อมูลด้วยการสร้างออบเจ็กต์ใหม่ กรองคีย์ที่ไม่น่าไว้วางใจ และใช้ freeze/seal เพื่อปกป้องโครงสร้างข้อมูลสำคัญ

การผสานออบเจ็กต์อย่างปลอดภัย การแช่แข็งและการผนึก — ภาพประกอบ 8

คำถามที่พบบ่อย

บทเรียน “การผสานออบเจ็กต์อย่างปลอดภัย การแช่แข็งและการผนึก” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การผสานออบเจ็กต์อย่างปลอดภัย การแช่แข็งและการผนึก” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส JavaScript Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส JavaScript Academy มีบทเรียนทั้งหมด 3 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การผสานออบเจ็กต์อย่างปลอดภัย การแช่แข็งและการผนึก”

ผสานออบเจ็กต์โดยไม่เกิดเรื่องไม่คาดคิด หลีกเลี่ยงการปนเปื้อนต้นแบบ และปกป้องข้อมูลด้วย Object.freeze กับ Object.seal คุณปฏิบัติ JavaScript Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน JavaScript Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน JavaScript Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 3 บทเรียน

บทเรียน “การผสานออบเจ็กต์อย่างปลอดภัย การแช่แข็งและการผนึก” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน JavaScript Academy นี้ได้ไหม

ได้ บทเรียน JavaScript Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การตรวจสอบอินพุตและพื้นฐานการหลีกอักขระ
  2. การผสานออบเจ็กต์อย่างปลอดภัย การแช่แข็งและการผนึก
  3. ขอบเขตข้อผิดพลาด (เชิงแนวคิด) โดยไม่ใช้เฟรมเวิร์ก
← กลับไปที่ JavaScript Academy