กรณีใช้งานพร็อกซีจริง
สร้างออบเจ็กต์สำหรับการตรวจสอบ การบันทึก และการตอบสนอง
กรณีใช้งานพร็อกซีจริง เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การสร้างพร็อกซี
- กับดัก get และ set
- Reflect API
- กรณีใช้งานพร็อกซีจริง