ใน JavaScript สามารถ "เขียนทับ" (Override) คุณสมบัติที่สืบทอดมาจาก Prototype ได้โดยการกำหนดค่าใหม่ให้กับ Instance โดยตรง ซึ่งจะสร้าง "Own Property" บน Instance เอง ทำให้ Prototype Property ถูกบัง (Shadowing)
ตัวอย่าง: Override Properties ที่สืบทอดมาจาก Prototype
<!DOCTYPE html>
<html lang="th">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Override Derived Properties</title>
<style>
body { font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; }
.result, .sample { font-size: 18px; font-weight: 500; }
.sample { color: rebeccapurple; }
.result { color: red; }
button { padding: 8px 16px; margin: 10px 0; cursor: pointer; }
</style>
</head>
<body>
<h1>เขียนทับคุณสมบัติที่สืบทอดมา (Override Derived Properties)</h1>
<div class="sample">ก่อนเขียนทับ (Overriding) <br></div>
<br>
<div class="result">หลังเขียนทับ (Overriding) <br></div>
<br>
<button class="Btn">คลิกเพื่อเขียนทับคุณสมบัติ</button>
<h3>กดปุ่มด้านบนเพื่อเขียนทับคุณสมบัติข้างต้น</h3>
<script>
let sampleEle = document.querySelector(".sample");
let resEle = document.querySelector(".result");
let BtnEle = document.querySelector(".Btn");
// Prototype Object
let objPerson = {
name: "Rahul",
age: 12,
class: 7
};
// สร้าง Object ใหม่ที่สืบทอดจาก objPerson
let Person1 = Object.create(objPerson);
// แสดงค่าที่สืบทอดมา (ก่อน Override)
sampleEle.innerHTML += `Person1.name = ${Person1.name} <br>`;
sampleEle.innerHTML += `Person1.age = ${Person1.age} <br>`;
sampleEle.innerHTML += `Person1.class = ${Person1.class} <br>`;
BtnEle.addEventListener("click", () => {
// Override: สร้าง Own Properties ใหม่บน Person1
Person1.name = "Shawn";
Person1.age = 18;
Person1.class = 12;
resEle.innerHTML += `Person1.name = ${Person1.name} <br>`;
resEle.innerHTML += `Person1.age = ${Person1.age} <br>`;
resEle.innerHTML += `Person1.class = ${Person1.class} <br>`;
// ตรวจสอบว่า Prototype ยังคงค่าเดิมอยู่
resEle.innerHTML += `<br>🔍 objPerson.name (Prototype) = ${objPerson.name}`;
});
</script>
</body>
</html>
ผลลัพธ์
ก่อนกดปุ่ม (สืบทอดมาจาก Prototype):
Person1.name = Rahul
Person1.age = 12
Person1.class = 7
หลังกดปุ่ม (Override แล้ว):
Person1.name = Shawn ✅ (Own Property)
Person1.age = 18 ✅ (Own Property)
Person1.class = 12 ✅ (Own Property)
objPerson.name (Prototype) = Rahul 🔄 (ไม่เปลี่ยน)
กลไกการทำงาน (Property Lookup)
Person1.name
│
├─ 1. หา Own Property "name" บน Person1 → พบ "Shawn" ✅ (Override)
│
└─ 2. ถ้าไม่พบ → เดินขึ้น Prototype Chain หา objPerson.name → "Rahul"
เมธอดตรวจสอบ Property
let Person1 = Object.create(objPerson);
Person1.name = "Shawn"; // Override
console.log(Person1.hasOwnProperty("name")); // true (Own Property)
console.log("name" in Person1); // true (รวม Prototype)
console.log(objPerson.hasOwnProperty("name")); // true (Prototype Property)
console.log(Person1.__proto__ === objPerson); // true
การลบ Override (คืนค่า Prototype)
delete Person1.name; // ลบ Own Property
console.log(Person1.name); // "Rahul" - กลับมาใช้ค่า Prototype อีกครั้ง
แนวคิด Shadowing vs Overriding
- Shadowing (การบัง) - สร้าง Property ใหม่บน Instance บัง Property เดิมบน Prototype
- Overriding (การเขียนทับ) - คำเรียกทั่วไปสำหรับ Shadowing ในบริบท OOP
- Prototype Property ไม่ถูกลบหรือเปลี่ยนแปลง - เพียงถูกบังเท่านั้น