ในโลกของการเขียนโปรแกรมเชิงวัตถุ (OOP) การเขียนโปรแกรมด้วย JavaScript นั้นมีความพิเศษตรงที่มันมีลักษณะเป็น OOP ที่ยืดหยุ่น ด้วยความสามารถในการทะลุกรอบแนวคิดดั้งเดิมของ OOP JavaScript สามารถทำให้การเขียนและการจัดการโค้ดเป็นไปอย่างมีประสิทธิภาพมากยิ่งขึ้น หนึ่งในเครื่องมือที่สำคัญที่สุดของ OOP ใน JavaScript คือการใช้ `this` keyword ซึ่งเติบโตเป็นแกนหลักที่จะช่วยให้เราสามารถเข้าถึงและจัดการค่าในออบเจ็กต์ได้อย่างคล่องตัว ในบทความนี้เราจะมาตีแผ่ถึงสมรรถนะของ `this` ในการช่วยสร้างและจัดการออบเจ็กต์ใน JavaScript พร้อมตัวอย่างการใช้งานที่เป็นประโยชน์
`this` keyword ใน JavaScript จะแสดงถึงออบเจ็กต์ที่ใช้งานในบริบท (context) ของการเรียกใช้ฟังก์ชันหรือเมธอดใดๆ ซึ่งในบางครั้งอาจทำให้นักพัฒนาที่เข้ามาใหม่ในภาษา JavaScript รู้สึกสับสนได้ เนื่องจากมันมีพฤติกรรมที่เปลี่ยนแปลงไปตามบริบทของการใช้งาน
การใช้งานทั่วไป
ใน JavaScript ฟังก์ชันสามารถสร้างมาเป็นออบเจ็กต์ได้ ซึ่ง `this` ทำหน้าที่ระบุว่าการเรียกใช้งานฟังก์ชันนั้นต้องอ้างอิงหรือจัดการแก่ใคร ยกตัวอย่างเช่นในฟังก์ชันปกติ `this` มักจะอ้างอิงถึง global object เช่น `window` ในบราวเซอร์ แต่ใน constructor หรือ method ของออบเจ็กต์ `this` จะอ้างอิงถึงอินสแตนซ์ของออบเจ็กต์นั้นๆ
การเข้าใจวิธีการทำงานของ `this` มีประโยชน์สำคัญในการเขียนโปรแกรม OOP ด้วย JavaScript โดยเฉพาะเมื่อเราต้องการสร้างออบเจ็กต์ที่สามารถใช้งานได้กับข้อมูลที่มีความหลากหลายและซับซ้อน การเขียนการอ้างอิง `this` อย่างถูกต้องจะช่วยให้โค้ดเต็มเปี่ยมไปด้วยความยืดหยุ่นและสามารถปรับปรุงได้ง่าย
ตัวอย่างการใช้งานใน Constructor Function
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
this.displayInfo = function() {
console.log(`This car is a ${this.year} ${this.make} ${this.model}.`);
};
}
const myCar = new Car('Toyota', 'Corolla', 2020);
myCar.displayInfo(); // Output: This car is a 2020 Toyota Corolla.
ในตัวอย่างนี้ เราสร้าง constructor function ชื่อ `Car` เมื่อสร้างอินสแตนซ์ใหม่ด้วย `new` keyword, `this` จะอ้างอิงถึงออบเจ็กต์ใหม่ที่ถูกสร้างขึ้น เช่น `myCar` ซึ่งทำให้เราสามารถเข้าถึงและแก้ไข property ของออบเจ็กต์นี้ผ่าน `this`
การทำงานของ `this` ไม่ได้เรียบง่ายเสมอไป ทั้งนี้เพราะ JavaScript สามารถเปลี่ยนแปลงบริบทของ `this` ได้หลายวิธี โดยเฉพาะอย่างยิ่งในฟังก์ชันที่มีการ callback หรือใช้ใน event handler ที่อาจทำให้พฤติกรรมของ `this` แตกต่างไปจากที่คาดคิดได้
การเปลี่ยนแปลงบริบทด้วย Call, Apply และ Bind
สามฟังก์ชันนี้ช่วยให้คุณสามารถควบคุม `this` ได้อย่างเฉพาะเจาะจง
- `call`: เรียกใช้งานฟังก์ชันและกำหนดค่า `this` ที่เจาะจงทันที
- `apply`: ทำงานคล้ายกับ `call` แต่ส่งค่า argument เป็น array
- `bind`: สร้างฟังก์ชันใหม่ที่ครั้งแรกถูกเรียกใช้ด้วย `this` และ argument ที่กำหนดไว้
function greet() {
console.log(`Hello, my name is ${this.name}.`);
}
const person = { name: 'John' };
greet.call(person); // Output: Hello, my name is John.
const boundGreet = greet.bind(person);
boundGreet(); // Output: Hello, my name is John.
เนื่องจาก `this` ใน JavaScript มีหลายบริบท ทำให้บางครั้งเกิดปัญหาเกี่ยวกับการเข้าถึงข้อมูลในออบเจ็กต์ ผิดพลาด
1. Arrow Functions: ไม่สามารถใช้ `this` ที่เปลี่ยนแปลงได้ใน block scope ของ Arrow Function เพราะมันจับค่าจาก lexical scope ดั้งเดิม 2. Lost Context: เมื่อ `this` ถูกใช้งานใน callback function โดยตรง
function Person(name) {
this.name = name;
this.sayName = function() {
setTimeout(function() {
console.log(`My name is ${this.name}.`);
}, 1000);
};
}
const john = new Person('John');
john.sayName(); // Expected: My name is John. | Actual: My name is undefined.
ในเรื่อง `this` ที่อ้างอิงถึง global object ในตัวอย่างนี้การแก้ปัญหามักใช้การอ้างอิง `this` ไว้ในตัวแปรเสริม เช่น `self = this;`
การเข้าใจถึงการใช้ `this` ใน JavaScript เป็นทักษะที่มีประโยชน์อย่างมหาศาลในการพัฒนาแอปพลิเคชันที่ซับซ้อน เนื่องจากความสามารถในการควบคุมบริบทและเข้าถึงข้อมูลที่เฉพาะเจาะจง `this` จึงเป็นหัวใจสำคัญที่จะช่วยให้นักพัฒนาสามารถสร้างฟังก์ชันที่หลากหลายและทรงพลังได้ สำหรับผู้ที่ต้องการพัฒนาทักษะนี้ต่อไป การศึกษาเพิ่มเติมในเชิงลึกเกี่ยวกับ JavaScript ที่สถาบันสอนเขียนโปรแกรมต่าง ๆ เช่น Expert-Programming-Tutor อาจเป็นตัวเลือกที่ดีในการพัฒนาและยกระดับความรู้ขึ้นไปอีกขั้น
หมายเหตุ: ข้อมูลในบทความนี้อาจจะผิด โปรดตรวจสอบความถูกต้องของบทความอีกครั้งหนึ่ง บทความนี้ไม่สามารถนำไปใช้อ้างอิงใด ๆ ได้ ทาง EPT ไม่ขอยืนยันความถูกต้อง และไม่ขอรับผิดชอบต่อความเสียหายใดที่เกิดจากบทความชุดนี้ทั้งทางทรัพย์สิน ร่างกาย หรือจิตใจของผู้อ่านและผู้เกี่ยวข้อง
หากเจอข้อผิดพลาด หรือต้องการพูดคุย ติดต่อได้ที่ https://m.me/expert.Programming.Tutor/
Tag ที่น่าสนใจ: java c# vb.net python c c++ machine_learning web database oop cloud aws ios android
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM