การ casting ใน JavaScript ตอนที่ 2

หลังจากบทความที่แล้วเราพูดถึงเรื่องของการใช้งาน prototype ในเบื้องต้นโดยในตอนนี้จะแนะนำการเอาไปใช้งานจริงๆ ว่าควรทำอย่างไร ซึ่งใน JavaScript จะมองทุกอย่างเป็น context(บริบท หรือมองว่าเป็นกล่องๆนึงก็ได้) ซึ่งในแต่ละ context สามารถที่จะนำไปผูกไว้ใน context ไหนก็ได้ โดย default จะเป็น window ดังนั้นถ้าเราจะพูดถึงเรื่องของการสร้าง class ใน JavaScript จะเป็นการสร้าง context ขึ้นมาใหม่ ดังนั้นถ้าเราต้องการสร้าง function ใน class หรือ context ที่เราต้องการ เราต้องใช้ keyword prototype

อันดับแรกเริ่มต้นโดยการสร้าง class หรือ context ขึ้นมาโดย การสร้าง function ธรรมดาขึ้นมา ดังนี้

1
2
3
function Stock(){
// constructor
}

สิ่งที่เราได้นอกจากจะเป็น context แล้วเสมือนว่าเราได้สร้าง constructor ขึ้นมาด้วย โดยถ้าเราใส่คำสั่งเข้าไปใน function จะถูกเรียกทำงานตอนเริ่มต้นสร้าง object การสร้าง object เขียนได้ดังนี้

1
var stock = new Stock();

หลังจากนี้ถ้าเราต้องการจะสร้าง method ของ class stock เราจะใช้การกำหนด function ให้กับ prototype ดังนี้

1
2
3
4
5
6
7
Stock.prototype.checkAvailable = function(product){
// do something
}

Stock.prototype.addProduct = function(product, qty){
// do something
}

หลังจากนี้เมื่อเราทำการ new Stock ขึ้นมาเราสามารถเรียกใช้ method ที่เรา add เข้าไปใน prototype ได้แบบนี้

1
2
3
var stock = new Stock();
stock.checkAvailable('P001');
stock.addProduct('P0001', 20);

ประมาณนี้เดี๋ยวตอนสุดท้ายจะพูดถึง __proro__ ซักที เป็นอันจบเรื่องของ Casting ใน JavaScript โปรดติดตามตอนต่อไป

การ Casting ใน JavaScript ตอนที่ 1

จากที่ได้เขียนเรื่องของการ Casting บน PHP มาแล้ว ต่อไปเราจะพูดถึงเรื่องของ การ Casting ใน JavaScript ซึ่งจะเป็นเรื่องที่แตกต่างจากภาษาอื่นๆเป็นอย่างมาก โดยสิ่งที่เราจะเป็นจะต้องรู้จักมี 2 ตัว คือ prototype และ __proto__ บทความนี้จะพูดถึงเฉพาะ prototype ก่อนแล้วกัน

ตัวแรกที่จะต้องรู้จักคือ prototype เป็นคำศัพท์ที่ชวนสับสนที่สุดใน JavaScript แล้ว(ความเห็นส่วนตัว ^_^) แต่เอาเป็นว่าใน JavaScript นี้ไม่มีการประกาศ Class เหมือนภาษาอื่นๆ ทางเดียวที่จะบอกว่าใน Class นั้นมี method อะไรบ้างให้ใช้ prototype เอาเป็นแบบนี้แล้วกันง่ายๆ ส่วนถ้าจะเอาความหมายมันจะเป็นเรื่องของ การเอา function นั้นไปผูกกับ context ที่เราต้องการ ยกตัวอย่างเช่น

1
2
3
Array.prototype.newMethod = function(){
// do something new
}

จะเป็นการผูก function newMethod() เข้าไปไว้ใน class หรือ context ของ Array ซึ่งหมายความว่า ตัวแปรที่เป็น array ก็จะสามารถเรียกใช้งาน newMethod() ได้ เช่น

1
2
var a = [1,2,3,4];
a.newMethod();

ก็แล้วแต่ว่าข้างใน newMethod จะทำงานอะไรเราสามารถที่จะอ้างถึง array นั้นได้ด้วย keyword this เช่นถ้าเราอยากจะเอาสมาชิกทุกตัวใน Array นั้นมาแสดงใน console ก็สามารถทำได้ ดังนี้

1
2
3
4
5
6
7
Array.prototype.newMethod = function(){
for(idx in this){
console.log(this[idx]);
}
}
var a = [1,2,3,4];
a.newMethod();

ผลลัพธ์ที่ได้จะเป็นการเอาสามาชิกทุกตัวของ Array ไปแสดงผลใน console เดี๋ยวค่อยมาต่อเรื่องของ __proto__ ในตอนต่อไป

การ Casting เบื้องต้น

ถ้าเราเขียนโปรแกรมเราคงหลีกเลี่ยงการ Cast ไม่ได้ ก่อนอื่นต้องอธิบายถึงเรื่องของการ Cast ก่อน การ Cast เป็นการแปลงข้อมูลที่ได้ให้เป็นชนิดข้อมูลที่เราต้องการ เช่น ใน php ถ้าเราต้องการข้อมูลที่เป็น integer แต่ตัวแปรที่เราได้มามีชนิดเป็น string เราสามารถทำการ cast ได้ดังนี้

1
$b = (int) $a;

เราจะได้ตัวแปร b ที่มีชนิดเป็น integer แต่เนื่องจาก php ทำการ cast ข้อมูลให้เราโดยอัตโนมัติ เราเลยไม่ต้องทำการ cast ซักเท่าไหร่ ส่วนใหญ่เราจะใช้ในการเขียนแบบ OOP ซะมากกว่า ถ้าไม่สามารถที่จะทำการ cast ได้ PHP จะทำการ แปลงเป็นค่า default ของ data type ชนิดนั้นๆ เช่น

1
2
$a = "abc";
$b = (int) $a;

ในกรณีนี้ PHP จะทำการแปลง ข้อความ “abc” เป็น 0 เพราะ “abc” ไม่ใช่ ตัวเลข แต่ถ้าเปลี่ยนจาก $a = “7” ค่าของ $b ก็จะเป็น 7 เพราะสามารถแปลงเป็นจำนวนเต็มได้
ถ้ากำหนดค่า $a = “7abc” ค่าของ $b ก็ยังคงจะได้ 7 เหมือนเดิม แต่ถ้า 7 อยู่ระหว่างข้อความค่าที่ได้จะเป็น 0 เสมือนว่าเป็นข้อความปกติ

ส่วนใหญ่ใน PHP จะไม่ได้ใช้การ Casting เท่าไหร่ เนื่องจากเป็นภาษาที่ยืดหนุ่นกว่าภาษาอื่นๆ ส่วนใหญ่ที่ใช้จะเป็นกรณีที่เราต้องการทำการสร้างความสัมพันธ์ของ Object โดย inject เข้าไปผ่านทาง parameter ของ function ดังตัวอย่าง

1
2
3
function addProduct(Product $p){
// add $p to product list
}

จากในตัวอย่างจะเป็นการส่งตัวแปร $p เข้ามาใน function โดยกำหนดอย่างชัดเจนว่า ตัวแปรที่ส่งมาต้องเป็น instance ของ Class Product ซึ่งจริงๆแล้วส่วนนี้ใน PHP จะเขียนหรือไม่เขียนก็ได้แต่ถ้าเราเขียนไว้จะช่วยลดข้อผิดพลาดที่เกิดขึ้นได้ และ Code ก็อ่านง่ายมากขึ้นด้วย