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

กรณีใช้งานพร็อกซีจริง

สร้างออบเจ็กต์สำหรับการตรวจสอบ การบันทึก และการตอบสนอง

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

พร็อกซีในการใช้งานจริง

ตอนนี้คุณจะรวมพร็อกซีกับ Reflect เพื่อแก้ปัญหาจริง ได้แก่ การตรวจสอบความถูกต้อง การบันทึกการทำงาน ค่าเริ่มต้น และอื่น ๆ แต่ละรูปแบบจะห่อหุ้มอ็อบเจ็กต์ธรรมดาโดยไม่เปลี่ยนแปลงอ็อบเจ็กต์นั้น

ตัวห่อหุ้มการตรวจสอบความถูกต้อง

บังคับใช้แบบแผนข้อมูล โดยปฏิเสธการเขียนใด ๆ ที่ไม่ผ่านกฎ target ยังคงสะอาด เพราะข้อมูลที่ไม่ถูกต้องจะไม่ถูกบันทึกลงไป

function validated(obj, rules) {
  return new Proxy(obj, {
    set(target, prop, value, receiver) {
      const rule = rules[prop];
      if (rule && !rule(value)) {
        throw new TypeError('invalid value for ' + prop);
      }
      return Reflect.set(target, prop, value, receiver);
    }
  });
}

const user = validated({}, { age: v => v >= 0 });
user.age = 25;
console.log(user.age);
try { user.age = -1; } catch (e) { console.log(e.message); }

ตัวห่อหุ้มการบันทึกการทำงาน

ติดตามการอ่านและการเขียนทุกครั้งเพื่อช่วยแก้จุดบกพร่อง โดยส่งต่อผ่าน Reflect หลังจากบันทึกการทำงาน

function logged(obj) {
  return new Proxy(obj, {
    get(t, p, r) { console.log('GET ' + p); return Reflect.get(t, p, r); },
    set(t, p, v, r) { console.log('SET ' + p + '=' + v); return Reflect.set(t, p, v, r); }
  });
}

const data = logged({ count: 0 });
data.count = 5;
console.log(data.count);

ค่าเริ่มต้น

ส่งคืนค่า fallback สำหรับคุณสมบัติที่หายไปทุกตัว เพื่อให้การอ่านไม่ส่งคืน undefined

function withDefault(obj, fallback) {
  return new Proxy(obj, {
    get(t, p, r) {
      return p in t ? Reflect.get(t, p, r) : fallback;
    }
  });
}

const scores = withDefault({ ada: 90 }, 0);
console.log(scores.ada);
console.log(scores.unknown);

การใช้ดัชนีอาร์เรย์ติดลบ

ทำให้อาร์เรย์รองรับดัชนีติดลบแบบไพธอนได้ด้วยการแปลงดัชนีเหล่านั้นในกับดัก get

function negIndex(arr) {
  return new Proxy(arr, {
    get(t, p, r) {
      const i = Number(p);
      if (Number.isInteger(i) && i < 0) {
        return Reflect.get(t, t.length + i, r);
      }
      return Reflect.get(t, p, r);
    }
  });
}

const list = negIndex(['a', 'b', 'c']);
console.log(list[-1]);
console.log(list[0]);

มุมมองแบบอ่านอย่างเดียว

เปิดเผยอ็อบเจ็กต์ที่อ่านได้แต่ไม่สามารถเขียนได้ เหมาะสำหรับปกป้อง config ที่ใช้ร่วมกัน

function readonly(obj) {
  return new Proxy(obj, {
    set() { console.log('blocked write'); return false; },
    deleteProperty() { console.log('blocked delete'); return false; }
  });
}

const config = readonly({ apiUrl: '/api' });
config.apiUrl = '/hacked';
console.log(config.apiUrl);

การนับการเข้าถึง

ติดตามจำนวนครั้งที่มีการอ่านคุณสมบัติแต่ละตัว โดยจัดเก็บ counts ไว้นอก target

function counted(obj) {
  const counts = {};
  const proxy = new Proxy(obj, {
    get(t, p, r) {
      counts[p] = (counts[p] || 0) + 1;
      return Reflect.get(t, p, r);
    }
  });
  return { proxy, counts };
}

const { proxy, counts } = counted({ x: 1 });
proxy.x; proxy.x; proxy.x;
console.log(counts.x);

คุณสมบัติเสมือนที่คำนวณได้

เปิดเผยค่าที่คำนวณจากข้อมูลอื่นและไม่ได้จัดเก็บไว้ โดยคำนวณใหม่ทุกครั้งที่อ่าน

const rect = new Proxy({ width: 4, height: 3 }, {
  get(t, p, r) {
    if (p === 'area') return t.width * t.height;
    return Reflect.get(t, p, r);
  }
});

console.log(rect.area);
rect.width = 10;
console.log(rect.area);

การโยนข้อผิดพลาดเมื่ออ่านสิ่งที่ไม่รู้จัก

ตรวจจับการพิมพ์ผิดได้ตั้งแต่เนิ่น ๆ ด้วยการโยนข้อผิดพลาดเมื่อโค้ดอ่านคุณสมบัติที่ไม่มีอยู่

function strict(obj) {
  return new Proxy(obj, {
    get(t, p, r) {
      if (typeof p === 'string' && !(p in t)) {
        throw new ReferenceError('unknown property: ' + p);
      }
      return Reflect.get(t, p, r);
    }
  });
}

const o = strict({ name: 'Ada' });
console.log(o.name);
try { console.log(o.naem); } catch (e) { console.log(e.message); }

การรวมข้อกังวลหลายด้าน

ตัวห่อหุ้มในงานจริงมักรวมการตรวจสอบความถูกต้องและการบันทึกการทำงานไว้ในตัวจัดการเดียว โดยกับดักแต่ละตัวจะส่งต่อไปยัง Reflect

const account = new Proxy({ balance: 0 }, {
  set(t, p, v, r) {
    if (p === 'balance' && v < 0) throw new RangeError('no overdraft');
    console.log(p + ' set to ' + v);
    return Reflect.set(t, p, v, r);
  }
});

account.balance = 100;
console.log(account.balance);
try { account.balance = -50; } catch (e) { console.log(e.message); }

เหตุใดรูปแบบเหล่านี้จึงสำคัญ

พร็อกซีช่วยเพิ่มพฤติกรรมที่ใช้ร่วมกันหลายส่วน การตรวจสอบความถูกต้อง การบันทึกการทำงาน ค่าเริ่มต้น และการควบคุมการเข้าถึง โดยไม่ทำให้อ็อบเจ็กต์ต้นฉบับหรือผู้เรียกใช้งานปะปนกับตรรกะเหล่านี้ นี่คือวิธีที่เฟรมเวิร์กแบบตอบสนองต่อการเปลี่ยนแปลงใช้สังเกตการเปลี่ยนแปลงของ state ใช้พร็อกซีเมื่อคุณต้องการการดักจับอย่างโปร่งใส

const observed = new Proxy({ n: 0 }, {
  set(t, p, v, r) {
    const ok = Reflect.set(t, p, v, r);
    console.log(p + ' is now ' + t[p]);
    return ok;
  }
});
observed.n = 1;
observed.n = 2;

ตรวจสอบความเข้าใจอย่างรวดเร็ว

คุณจะใช้กับดักพร็อกซีใดเพื่อปฏิเสธค่าที่ไม่ถูกต้องก่อนจัดเก็บ

ทบทวน: กรณีการใช้งานพร็อกซีจริง

คุณได้นำพร็อกซีไปใช้แก้ปัญหาจริง:

  • การตรวจสอบความถูกต้องในกับดัก set จะปฏิเสธข้อมูลที่ไม่ถูกต้อง
  • การบันทึกการทำงานจะติดตามการอ่านและการเขียนผ่าน Reflect
  • ค่าเริ่มต้นและคุณสมบัติเสมือนอยู่ในกับดัก get
  • มุมมองแบบอ่านอย่างเดียว การนับการเข้าถึง และการตรวจจับการพิมพ์ผิดอย่างเข้มงวด ล้วนห่อหุ้มอ็อบเจ็กต์ได้โดยไม่รบกวนการทำงานเดิม

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

บทเรียน “กรณีใช้งานพร็อกซีจริง” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “กรณีใช้งานพร็อกซีจริง”

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

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

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

บทเรียน “กรณีใช้งานพร็อกซีจริง” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การสร้างพร็อกซี
  2. กับดัก get และ set
  3. Reflect API
  4. กรณีใช้งานพร็อกซีจริง
← กลับไปที่ JavaScript Academy