前面幾篇已經大量使用物件(例如 document、Math)。這一篇要學習如何自己建立物件,並用 class 把「資料」與「功能」包裝在一起,讓程式更有條理。
一、物件:用屬性描述一個東西
const student = {
name: '小明',
age: 20,
scores: [78, 92, 65],
greet() {
return '大家好,我是' + this.name;
}
};
console.log(student.name); // 小明(點記法)
console.log(student['age']); // 20(中括號記法,屬性名稱可用變數)
console.log(student.greet()); // 大家好,我是小明
student.age = 21; // 修改
student.email = 'ming@example.com'; // 新增(範例信箱)
delete student.email; // 刪除
物件裡的函式稱為方法。
二、this:指的是「呼叫它的物件」
方法裡的 this 通常指向呼叫該方法的那個物件。上例中 student.greet() 的 this 就是 student。
常見陷阱:箭頭函式沒有自己的 this
const obj = {
name: '小明',
good() { return this.name; }, // 正確
bad: () => { return this.name; } // 箭頭函式的 this 不是 obj,拿不到 name
};
console.log(obj.good()); // 小明
console.log(obj.bad()); // 拿不到「小明」(結果依執行環境而定,可能是空字串或 undefined)
所以「物件裡的方法」請用 greet() { ... } 的寫法,不要用箭頭函式。另一個陷阱是把方法單獨取出來呼叫(例如 const f = student.greet; f();),這時 this 就不是 student 了。