JavaScript
Object
Method
เรียนรู้วิธีสร้าง method — function ที่เก็บใน object — ด้วยสองรูปแบบ syntax การเรียกใช้งาน และการใช้ method ร่วมกับ property อื่นใน object เดียวกัน
Method คือ function ที่เก็บเป็น property ของ object
method คือ **function** ที่ถูก assign ให้เป็น value ของ property ใน object — แทนที่จะเก็บแค่ string, number, หรือ boolean ก็เก็บ function ไว้แทนได้ การเก็บ function ไว้ใน object ทำให้เรา **รวมข้อมูล (data) และพฤติกรรม (behavior)** ไว้ด้วยกัน — เช่น object `car` มีทั้ง property `speed` และ method `accelerate()`
`accelerate` คือ method — เป็น function ที่ทำงานกับข้อมูลของ object car เอง
const car = {
brand: "Toyota",
speed: 0,
// method — function ที่เป็น property
accelerate: function () {
car.speed = car.speed + 10;
console.log("ความเร็วตอนนี้:", car.speed);
},
};
car.accelerate(); // "ความเร็วตอนนี้: 10"
car.accelerate(); // "ความเร็วตอนนี้: 20"method ต่างจากฟังก์ชันทั่วไปแค่ตรงที่มันอยู่ใน object — นอกนั้นทำงานเหมือนฟังก์ชันทุกอย่าง: รับ parameter ได้, return ค่าได้, ใช้ expression ได้
วิธีสร้าง method — สองรูปแบบหลัก
มี 2 วิธีเขียน method ใน JavaScript: **แบบเต็ม:** `methodName: function() { }` — ใช้ function expression assign เป็น property value **แบบย่อ (ES6 shorthand):** `methodName() { }` — ตัดคำว่า `function` ออก เขียนสั้นกว่า ทั้งสองแบบทำงานเหมือนกันทุกประการ — shorthand เป็นที่นิยมในโค้ดปัจจุบันเพราะอ่านง่ายกว่า
`greet: function()` กับ `greet()` ได้ผลลัพธ์เหมือนกัน — shorthand สั้นกว่า
// แบบเต็ม — function expression
const user1 = {
name: "สมชาย",
greet: function () {
return "สวัสดี " + user1.name;
},
};
// แบบย่อ — ES6 method shorthand
const user2 = {
name: "สมหญิง",
greet() {
return "สวัสดี " + user2.name;
},
};
console.log(user1.greet()); // "สวัสดี สมชาย"
console.log(user2.greet()); // "สวัสดี สมหญิง"| รูปแบบ | Syntax | ใช้เมื่อไหร่ |
|---|---|---|
| Function expression | `methodName: function() { }` | เมื่อต้องการเขียนแบบชัดเจน หรือทำงานกับโค้ดเก่า |
| Method shorthand | `methodName() { }` | โค้ดใหม่ทั่วไป — สั้น อ่านง่าย เป็นที่นิยม |
การเรียก method — `object.methodName()`
การเรียก method เหมือนการอ่านค่า property ด้วย dot notation ทุกอย่าง — แค่เพิ่ม `()` ต่อท้ายเพื่อเรียกฟังก์ชัน รูปแบบ: `object.methodName()` — อ่าน method ออกจาก object แล้ว execute ทันที
`calculator.add(5, 3)` — object ชื่อ method ตามด้วย `(arguments)`
const calculator = {
add(a, b) {
return a + b;
},
subtract(a, b) {
return a - b;
},
};
// เรียก method — เหมือนเรียก function แต่ต้องผ่าน object
console.log(calculator.add(5, 3)); // 8
console.log(calculator.subtract(10, 4)); // 6
// เก็บ method ในตัวแปรก่อนก็ได้ — แต่ระวังเรื่องการผูก context (เรียนบทนี้)
const fn = calculator.add;
console.log(fn(2, 3)); // 5- **เรียกโดยตรง:** `obj.method()` — ใช้บ่อยที่สุด
- **ส่ง argument:** `obj.method(arg1, arg2)` — เหมือนฟังก์ชันปกติ
- **ใช้ return value:** `const result = obj.getResult()` — รับค่าที่ method คืนมา
Method ใช้ข้อมูลของ object ได้ — เข้าถึง property อื่นผ่านชื่อตัวแปร object
method สามารถเข้าถึง property อื่นของ object เดียวกันได้ — โดยอ้างถึงตัวแปร object จาก scope ภายนอก (closure) วิธีนี้ใช้ได้เพราะ object ถูกประกาศใน scope ที่ method มองเห็น — แต่ต้องระวังเมื่อตัวแปร object ถูก reassign
`person.firstName` ใน method — ใช้ชื่อตัวแปร object จาก scope ด้านนอก
const person = {
firstName: "สมชาย",
lastName: "ใจดี",
age: 30,
fullName() {
// เข้าถึง property อื่นผ่านชื่อตัวแปร person
return person.firstName + " " + person.lastName;
},
isAdult() {
return person.age >= 18;
},
};
console.log(person.fullName()); // "สมชาย ใจดี"
console.log(person.isAdult()); // trueในบทถัดไปจะเรียนรู้ `this` — keyword พิเศษที่ใช้แทนการอ้างชื่อตัวแปร object โดยตรง ทำให้ method ใช้ซ้ำกับ object คนละตัวได้ง่ายขึ้น โดยไม่ต้องผูกกับชื่อตัวแปรใดตัวแปรหนึ่ง
Method ก็คือ function — รับ parameter และ return ค่าได้
method ทำงานเหมือนฟังก์ชันทุกประการ — มี parameter, return value, local variable, if/else, และ loop ได้เหมือนกันหมด
method `getTotal` รับ `taxRate` เป็น parameter — คำนวณเหมือนฟังก์ชันปกติ
const cart = {
items: 3,
price: 500,
// method ที่รับ parameter
getTotal(taxRate) {
const subtotal = cart.price * cart.items;
const tax = subtotal * taxRate;
return subtotal + tax;
},
// method ที่ใช้ if/else
getStatus() {
if (cart.items === 0) return "ว่าง";
if (cart.items <= 3) return "กำลังดี";
return "เยอะ";
},
};
console.log(cart.getTotal(0.07)); // 1605 (1500 + 105)
console.log(cart.getStatus()); // "กำลังดี"สรุป: method = function ใน object — ข้อแตกต่างเดียวคือการเรียกต้องผ่าน object