JavaScript
Class
Class คืออะไร
เรียนรู้ว่า class คือพิมพ์เขียวสำหรับสร้าง object, วิธีประกาศ class, การสร้าง instance ด้วย new, และการเลือกใช้ class แทน object literal เมื่อต้องสร้าง object หลายตัวที่มีโครงสร้างเดียวกัน
Class คือพิมพ์เขียวสำหรับสร้าง object
Class คือ **แม่แบบ** หรือ **พิมพ์เขียว** ที่ใช้กำหนดโครงสร้างของ object แทนที่จะสร้าง object ทีละตัวแบบซ้ำ ๆ ด้วย `{}` เรานิยามโครงสร้างไว้ใน class ครั้งเดียว แล้วใช้ `new` สร้าง object ออกมาได้กี่ตัวก็ได้ — ทุกตัวจะมีโครงสร้างเหมือนกัน
ใช้ keyword `class` ตามด้วยชื่อ class (นิยมตั้งเป็น PascalCase) แล้วตามด้วย `{ }`
// ประกาศ class ชื่อ User
class User {
}ตัว class เปล่าแบบนี้ยังไม่ได้ทำอะไร — มันเป็นแค่แม่แบบที่ยังไม่มีการกำหนดรายละเอียด ขั้นตอนถัดไปคือการ **สร้าง instance** — ใช้ keyword `new` ตามด้วยชื่อ class เพื่อสร้าง object จริง ๆ จากแม่แบบนั้น
`new User()` สร้าง object จาก class `User` — เรียกกี่ครั้งก็ได้ instance ใหม่ทุกครั้ง
class User {
}
const u1 = new User();
const u2 = new User();
const u3 = new User();
console.log(u1); // User {}
console.log(u2); // User {}
console.log(u3); // User {}ทุกครั้งที่ใช้ `new` JavaScript จะสร้าง object ใหม่จากแม่แบบที่เรากำหนดไว้ **เปรียบเทียบกับ object literal** — `{}` สร้าง object ทีละตัวโดยไม่ได้มาจากแม่แบบร่วมกัน ส่วน class ให้นิยามครั้งเดียวแล้วผลิตซ้ำได้ — เหมือนโรงงานที่มีแม่พิมพ์หนึ่งชิ้น ผลิตของออกมาได้นับร้อยชิ้น
แต่ละ instance เป็น object อิสระจากกัน
instance แต่ละตัวที่สร้างจาก class เดียวกัน เป็น **คนละ object** — แก้ไขตัวหนึ่ง ไม่กระทบอีกตัว นี่คือข้อดีของ class เพราะเราสร้าง object หลายตัวที่มีโครงสร้างเดียวกัน โดยที่ข้อมูลของแต่ละตัวเป็นอิสระต่อกัน
`u1` และ `u2` มาจาก class เดียวกัน แต่เป็น object คนละตัว — `===` ให้ `false`
class User {
}
const u1 = new User();
const u2 = new User();
console.log(u1 === u2); // false
console.log(typeof u1); // "object"
console.log(typeof u2); // "object"- instance ทุกตัวเป็น `object` — `typeof` จะคืน `"object"` เสมอ
- instance ที่มาจาก class เดียวกัน เป็นคนละ object — เปรียบเทียบด้วย `===` จะได้ `false`
- class เป็นแค่แม่แบบ — ตัว instance ต่างหากคือของจริงที่เราใช้งาน
- แนวคิดนี้สำคัญมากก่อนไปเรียนรู้ `constructor`, `methods`, และการสืบทอดในบทต่อ ๆ ไป
Class เทียบกับ Object Literal — ใช้ตอนไหน
เมื่อเจอโจทย์ที่ต้องสร้าง object หลายตัวที่มีโครงสร้างเดียวกัน คลาสช่วยลดโค้ดซ้ำและทำให้โค้ดอ่านง่ายขึ้น ตารางต่อไปนี้สรุปว่าเมื่อไรควรเลือกใช้ class และเมื่อไรควรใช้ object literal:
| เรื่องที่เทียบ | Object Literal `{}` | Class `class` + `new` |
|---|---|---|
| สร้างกี่ object | 1 ตัวต่อการเขียน 1 ครั้ง | สร้างกี่ตัวก็ได้จากแม่แบบเดียว |
| โครงสร้าง | กำหนดเองทีละ object | กำหนดโครงสร้างครั้งเดียว ทุก instance เหมือนกัน |
| เหมาะกับ | ข้อมูลเฉพาะกิจ — config, options, ข้อมูลชุดเดียว | ข้อมูลที่มีรูปร่างซ้ำ — user, product, order, post |
| โค้ดซ้ำ | ต้องเขียน `{ }` ใหม่ทุกครั้ง → ซ้ำเยอะถ้ามีหลายตัว | นิยาม class ครั้งเดียว → ไม่ต้องเขียนโครงสร้างซ้ำ |
ซ้าย: object literal — เขียนโครงสร้างซ้ำ 3 รอบ ขวา: class — นิยามครั้งเดียว สร้าง instance ได้เรื่อย ๆ
// Object Literal — ต้องเขียนโครงสร้างซ้ำ
const user1 = { name: "สมชาย", role: "admin" };
const user2 = { name: "สมหญิง", role: "editor" };
const user3 = { name: "สมศรี", role: "viewer" };
// Class — นิยามครั้งเดียว (ในบทนี้ class ยังเป็นแค่แม่แบบเปล่า)
// ในบท constructor เราจะเติม property ให้ instance ได้
class User {
}
const u1 = new User();
const u2 = new User();
const u3 = new User();ในตัวอย่างด้านบน class `User` ยังเป็นแค่แม่แบบเปล่า — instance ที่สร้างออกมายังไม่มี property ใด ๆ ในบทถัดไปเราจะเรียน `constructor` ซึ่งเป็นกลไกที่ทำให้ instance รับค่าตั้งต้นได้ — `new User("สมชาย", "admin")` แล้วได้ object ที่มี `name` และ `role` ทันที
คลาสว่างก็สร้าง instance ได้ — รอเรียนรู้ constructor
class ที่ว่างเปล่า `class Product { }` ก็ใช้งานได้ทันที — สร้าง instance ด้วย `new Product()` ได้ปกติ instance ที่ได้จะเป็น object จริง — แค่ยังไม่มี property อะไรข้างใน นอกจากที่ JavaScript ติดมาให้
class `Product` ไม่มีอะไรข้างในเลย — แต่ `new Product()` ก็ยังสร้าง object ได้
class Product {
}
const p1 = new Product();
const p2 = new Product();
console.log(p1); // Product {}
console.log(p2); // Product {}
console.log(typeof p1); // "object"
console.log(p1 === p2); // false**ข้อควรรู้ก่อนไปบทต่อไป:** • `constructor` (บทที่ 89) จะทำให้เราใส่ค่าเริ่มต้นให้ instance ได้ — `new Product("ปากกา", 25)` • `methods` (บทที่ 90) จะทำให้ instance มีฟังก์ชันของตัวเอง — `p1.getInfo()` • ตอนนี้ขอให้จำไว้ว่า class คือพิมพ์เขียว และ `new` คือวิธีสร้าง object จากพิมพ์เขียวนั้น
Lab 1: สร้าง class เปล่าและ instance แรก
Lab 2: สร้างหลาย instance — แต่ละตัวเป็นคนละ object
Lab 3: สร้าง class Student และ 3 instance
Lab 4: เลือกใช้ class หรือ object literal
อ่านสถานการณ์ต่อไปนี้ แล้วตัดสินใจว่าควรใช้ **class** หรือ **object literal** พร้อมเขียนโค้ดสั้น ๆ แสดงเหตุผล
งานที่ต้องทำ
- สถานการณ์ A: ต้องเก็บข้อมูล profile ของตัวเองคนเดียว — มี name, age, email
- สถานการณ์ B: ระบบต้องสร้าง object ผู้เล่นเกมหลายร้อยคน — ทุกคนมีข้อมูลเหมือนกันคือ hp, score, level
- สถานการณ์ C: config ของแอป — มี theme, language, version อย่างละ 1 ค่า
ตัวอย่างและข้อมูลประกอบ
หลักคิด: ถ้าต้องการ object หลายตัวที่มีโครงสร้างเดียวกัน → ใช้ class ถ้าต้องการแค่ข้อมูล 1 ชุด → ใช้ object literal `{}`
// config ของแอป — แค่ชุดเดียว
const config = {
theme: "dark",
language: "th",
};
console.log(config.theme); // "dark"// ผู้เล่นเกม — ต้องสร้างหลายร้อยคน
class Player {
}
const p1 = new Player();
const p2 = new Player();
// ... สร้างต่อได้เรื่อย ๆลองทำด้วยตัวเองก่อน แล้วค่อยเปิดเฉลยเพื่อเทียบแนวคิดและรายละเอียด