JavaScript อนุญาตให้แก้ไข prototype ของ built-in objects ได้ (เช่น Array.prototype, String.prototype, window.alert) แต่ ไม่แนะนำ เพราะอาจก่อให้เกิดความขัดแย้งกับโค้ดอื่นหรือไลบรารี
ตัวอย่างโค้ด (เพื่อการศึกษาเท่านั้น)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Modify Built-in Prototype</title>
<style>
body { font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; }
.result { font-size: 20px; font-weight: 500; color: blueviolet; }
</style>
</head>
<body>
<h1>แก้ไข Built-in Object Prototypes</h1>
<div class="result"></div>
<br />
<button class="Btn">คลิกที่นี่</button>
<h3>คลิกปุ่มด้านบนเพื่อเรียกเมธอด alert ที่ถูก override</h3>
<script>
const resEle = document.querySelector(".result");
const BtnEle = document.querySelector(".Btn");
// Override window.alert - ไม่ควรทำในโปรดักชัน!
window.alert = function(msg) {
resEle.innerHTML = "Custom Alert function ถูกเรียก<br>";
resEle.innerHTML += "Alert Message = " + msg;
};
BtnEle.addEventListener("click", () => {
alert("Hello World");
});
</script>
</body>
</html>
⚠️ ทำไมจึงไม่ควรทำ?
- Global Pollution: ส่งผลกระทบต่อโค้ดทั้งหมดในหน้าเว็บ รวมถึงไลบรารีภายนอก
- Conflict: อาจชนกับ Polyfill หรือ Framework ที่คาดหวังพฤติกรรมมาตรฐาน
- Maintenance: ยากต่อการ debug และบำรุงรักษา
- Future-proofing: มาตรฐานใหม่อาจเพิ่มเมธอดชื่อเดียวกัน ทำให้เกิดข้อขัดแย้ง
ทางเลือกที่ดีกว่า
- สร้าง Utility Functions แทน ใช้ Class หรือ Module pattern ห่อหุ้มฟังก์ชัน
- ใช้
Object.create(null)สร้างออบเจกต์โดยไม่มี prototype
ผลลัพธ์
แสดงข้อความแจ้งเตือนแบบกำหนดเองแทน alert ปกติของเบราว์เซอร์