อยากให้ JavaScript มี keyword final แบบ Java ต้องทำอย่างไร

Aphipu Nongbualang
Dec 2 · 2 min read

สวัสดีท่านผู้อ่านทุกท่าน สำหรับท่านใดที่คุ้นเคยกับภาษา Java มาก่อน ก็จะรู้ว่าเราสามารถกำหนด type ของตัวแปรให้เป็น final ได้ ซึ่งเจ้า final นี้เองที่ทำให้ code ของเราคงคุณสมบัติ closed ต่อการเปลี่ยนแปลง ไม่อนุญาตให้เพิ่ม ลด แก้ไข ซึ่งช่วยลดโอกาสการเกิดบัคในอนาคตได้ด้วย

วันนี้เราจะมานำเสนอวิธีดังกล่าวในของภาษา JavaScript กันครับ ไปดูกันเลย

ใน ECMAScript 5 นั้น คลาส Object มี method ให้เรียกได้นั่นคือ Object.freeze(), Object.seal() และ Object.preventExtensions() ซึ่งผมจะอธิบายรายตัวเลยเริ่มจาก


Object.freeze()

หลายคนเดาได้จากชื่อเลยครับ ก็คือเป็นเหมือนการแช่แข็ง object นั้น โดยไม่อนุญาตให้เปลี่ยนแปลง(ลบ/เพิ่ม/แก้ไข)ใดๆได้เลย

ส่วน method สำหรับใช้ตรวจสอบว่า object นั้นถูกแช่แข็งอยู่หรือไม่ ก็คือ Object.isFrozen()

ตัวอย่าง

let cat = {
name: "Malee",
gender: "female",
};
Object.freeze(cat);
Object.isFrozen(cat); // return true
cat.breed = "Persian";
console.log(cat.breed); // return undefined
cat.name = "Mali";
console.log(cat); // return { name: "Malee", gender: "female" }
delete cat.name;
console.log(cat); // return { name: "Malee", gender: "female" }

Object.seal()

เป็นเหมือนการแพ็ค ซีลของไว้ไม่ให้เพิ่มไม่ให้ลด คือไม่อนุญาตให้ เพิ่ม properties ใหม่ๆ หรือลบ properties ที่มีอยู่แล้วได้เลย แต่ยังอนุญาตให้สามารถแก้ไข properties ที่มีอยู่แล้วได้

method สำหรับใช้ตรวจสอบว่า object นั้นถูก seal อยู่หรือไม่ คือ Object.isSealed()

ตัวอย่าง

let cat = {
name: "Malee",
gender: "female",
};
Object.seal(cat);
Object.isSealed(cat); // return true
//Type error
cat.breed = "Persian";
console.log(cat.breed); // return undefined
cat.name = "Mali";
console.log(cat); // return { name: "Mali", gender: "female" }
delete cat.name;
console.log(cat); // return { name: "Mali", gender: "female" }

//TypeError
Object.defineProperty(cat, "name", {
get: () => "Nomyen",
});

Object.preventExtensions()

ชื่อตรงไปตรงมาที่สุด เป็นการห้ามไม่ให้ Object มี properties ใหม่ แต่สามารถแก้หรือลบ properties ที่มีอยู่ได้ นั่นเอง

method ที่ใช้ตรวจสอบว่า Object สามารถเพิ่ม properties ใหม่ได้หรือไม่ Object.isExtensible()

ตัวอย่าง

let cat = {
name: "Malee",
gender: "female",
};
Object.preventExtensions(cat);
Object.isExtensible(cat); // return false
cat.breed = "Persian";
console.log(cat.breed); // return undefined
cat.name = "Mali";
console.log(cat); // return { name: "Mali", gender: "female" }
delete cat.name;
console.log(cat); // return { gender: "female" }

สรุป


ข้อจำกัด

ทั้งสาม method ข้างต้นนั้น เป็นการห้ามแบบ shallowly หมายความว่า สามารถห้ามได้เฉพาะ property ที่เข้าถึงได้ในชั้นแรกเท่านั้น ส่วน property ที่เป็น Object ซ้อน หรือแบบ nested นั้น จะไม่สามารถห้ามได้

ConvoLab

Leading Enterprise Chat Management Platform in Thailand

Aphipu Nongbualang

Written by

ConvoLab

ConvoLab

Leading Enterprise Chat Management Platform in Thailand

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade