Phương thức của object trong JavaScript
Javascript căn bản | by
Trong JavaScript, Object là một trong những kiểu dữ liệu quan trọng nhất, cho phép lưu trữ và quản lý dữ liệu dưới dạng cặp key-value. Để làm việc với Object hiệu quả, phương thức (method) đóng vai trò quan trọng trong việc xử lý và thao tác với dữ liệu bên trong Object. Phương thức trong Object thực chất là các hàm được định nghĩa bên trong một Object và có thể được gọi để thực hiện các hành động cụ thể. Chúng giúp đóng gói logic, tổ chức mã nguồn gọn gàng hơn, và tạo ra các đối tượng có thể tương tác linh hoạt trong lập trình.
Trong bài viết này, mình sẽ tìm hiểu chi tiết về cách khai báo, gọi phương thức, sử dụng từ khóa this, cũng như các phương thức hữu ích khác của Object trong JavaScript.
Khái niệm về phương thức Object trong JavaScript
Định nghĩa phương thức (Method) trong Object
Trong JavaScript, phương thức (method) là một thuộc tính của Object, nhưng thay vì chứa dữ liệu như một biến thông thường, nó có giá trị là một hàm. Phương thức giúp Object thực hiện các hành động cụ thể, tương tác với dữ liệu bên trong Object, và cung cấp các chức năng hữu ích.
Cách khai báo phương thức trong Object
Có hai cách chính để khai báo một phương thức trong Object:
Cách 1: Khai báo phương thức bằng function expression
Ta có thể khai báo phương thức bằng cách gán một hàm ẩn danh (anonymous function) hoặc một hàm có tên (named function) vào một thuộc tính của Object.
let person = {
name: "Alice",
age: 25,
greet: function() {
console.log("Xin chào! Tôi là " + this.name);
}
};
// Gọi phương thức
person.greet(); // Output: Xin chào! Tôi là Alice
Ở ví dụ trên:
greetlà một phương thức của Objectperson.- Phương thức
greet()khi được gọi sẽ in ra chuỗi chào có chứa tên của đối tượng. - Từ khóa
thisđược sử dụng để tham chiếu đến thuộc tínhnamecủa Object hiện tại.
Cách 2: Khai báo phương thức theo cú pháp viết tắt (Method Shorthand - ES6)
Trong ES6, JavaScript hỗ trợ cách viết gọn hơn khi khai báo phương thức trong Object:
let person = {
name: "Alice",
age: 25,
greet() { // Viết gọn không cần dùng `function`
console.log(`Xin chào! Tôi là ${this.name}`);
}
};
person.greet(); // Output: Xin chào! Tôi là Alice
Cách này giúp mã nguồn ngắn gọn, dễ đọc, và khuyến khích sử dụng trong ES6+.
Sự khác biệt giữa phương thức và thuộc tính thông thường
| Thuộc tính | Phương thức |
|---|---|
| Lưu trữ một giá trị (số, chuỗi, boolean, mảng, object, v.v.). | Lưu trữ một hàm thực hiện hành động nào đó. |
| Truy xuất dữ liệu đơn giản. | Xử lý dữ liệu động, có thể thay đổi theo logic. |
Ví dụ: person.name = "Alice" |
Ví dụ: person.greet() |
Ví dụ minh họa:
let car = {
brand: "Toyota", // Thuộc tính lưu trữ dữ liệu
speed: 100,
accelerate() { // Phương thức thực hiện hành động
this.speed += 10;
console.log(`Tốc độ hiện tại: ${this.speed} km/h`);
}
};
console.log(car.brand); // Toyota (Thuộc tính)
car.accelerate(); // Tốc độ hiện tại: 110 km/h (Phương thức)
Cách khai báo và gọi phương phức Object trong JavaScript
Khai báo phương thức trong Object
Có hai cách phổ biến để khai báo phương thức trong một Object:
Cách 1: Khai báo phương thức thông qua function (Cách truyền thống)
Trong cách này, ta gán một hàm ẩn danh (anonymous function) hoặc hàm có tên (named function) làm giá trị của một thuộc tính trong Object.
Ví dụ:
let person = {
name: "Alice",
age: 25,
greet: function() {
console.log("Xin chào! Tôi là " + this.name);
}
};
// Gọi phương thức
person.greet(); // Output: Xin chào! Tôi là Alice
Giải thích:
greetlà một phương thức của Objectperson.this.namedùng để truy cập thuộc tínhnamebên trong Object.
Cách 2: Cách viết tắt phương thức trong ES6+ (Method Shorthand)
Trong ES6, ta có thể khai báo phương thức theo cú pháp rút gọn, giúp mã nguồn ngắn gọn hơn.
let user = {
name: "Bob",
sayHello() {
console.log(`Xin chào! Tôi là ${this.name}`);
}
};
// Gọi phương thức bằng dấu `[]`
user["sayHello"](); // Output: Xin chào! Tôi là Bob
Khi nào nên dùng [] thay vì .?
Khi tên phương thức được lưu trong một biến động hoặc được tạo động.
let methodName = "sayHello";
let user = {
name: "Bob",
sayHello() {
console.log(`Xin chào! Tôi là ${this.name}`);
}
};
user[methodName](); // Output: Xin chào! Tôi là Bob
Ghi nhớ:
- Dấu
.phù hợp khi biết chắc tên phương thức. - Dấu
[]hữu ích khi tên phương thức cần được truy xuất động.
| Cách khai báo phương thức | Ví dụ |
|---|---|
| Dùng function truyền thống | greet: function() { console.log("Hello"); } |
| Dùng ES6+ (Shorthand) | greet() { console.log("Hello"); } |
| Cách gọi phương thức | Ví dụ |
|---|---|
Dấu . (dot notation) |
object.method(); |
Dấu [] (bracket notation) |
object["method"](); |
this trong phương thức của Object trong JavaScript
Định nghĩa this trong Object
Trong JavaScript, this là một từ khóa đặc biệt dùng để tham chiếu đến ngữ cảnh (context) hiện tại mà nó đang được sử dụng. Khi sử dụng this bên trong một phương thức của Object, nó thường trỏ đến chính Object đó.
Ví dụ đơn giản về this trong Object:
let person = {
name: "Alice",
age: 25,
greet() {
console.log(`Xin chào! Tôi là ${this.name}`);
}
};
person.greet(); // Output: Xin chào! Tôi là Alice
Giải thích:
- Trong phương thức
greet(),this.nametrỏ đếnnamecủa Objectperson. - Khi gọi
person.greet(),thistrỏ đếnperson, vì phương thức này được gọi trên Object đó.
this trỏ đến Object chứa nó
Trong JavaScript, giá trị của this phụ thuộc vào cách phương thức được gọi.
Các trường hợp thường gặp:
Trường hợp 1: this trỏ đến Object chứa phương thức
let car = {
brand: "Toyota",
showBrand() {
console.log(`Hãng xe: ${this.brand}`);
}
};
car.showBrand(); // Output: Hãng xe: Toyota
Giải thích: this.brand trỏ đến brand trong car, vì showBrand() được gọi từ car.
Trường hợp 2: this trong một hàm độc lập bên trong phương thức của Object
let person = {
name: "Alice",
age: 25,
showInfo() {
function innerFunction() {
console.log(this.name); // Lỗi: this không trỏ đến person
}
innerFunction();
}
};
person.showInfo(); // Output: undefined (hoặc lỗi trong chế độ nghiêm ngặt)
Giải thích:
innerFunction()không phải là phương thức củaperson, nó chỉ là một hàm thông thường được gọi bên trongshowInfo().- Trong chế độ thông thường (
non-strict mode),thistronginnerFunction()sẽ trỏ đếnwindow(hoặcglobalobject trong Node.js). - Trong chế độ nghiêm ngặt (
strict mode),thissẽ làundefined.
Trường hợp 3: Sử dụng this trong setTimeout()
let user = {
name: "Bob",
greet() {
setTimeout(function () {
console.log(`Xin chào! Tôi là ${this.name}`);
}, 1000);
}
};
user.greet(); // Output: undefined (hoặc lỗi)
Giải thích:
setTimeout()là một hàm toàn cục, vì vậythistrong đó trỏ đếnwindow(hoặcglobalobject trong Node.js), không phảiuser.- Do đó,
this.namesẽ làundefined.
Cách khắc phục: Sử dụng arrow function để giữ giá trị của this.
let user = {
name: "Bob",
greet() {
setTimeout(() => {
console.log(`Xin chào! Tôi là ${this.name}`);
}, 1000);
}
};
user.greet(); // Output: Xin chào! Tôi là Bob
Arrow function không có this riêng, nó kế thừa this từ phạm vi chứa nó (user trong trường hợp này).
Những lỗi thường gặp khi sử dụng this trong phương thức Object
Lỗi 1: Mất ngữ cảnh this khi gán phương thức vào một biến
let car = {
brand: "Toyota",
showBrand() {
console.log(this.brand);
}
};
let getBrand = car.showBrand;
getBrand(); // Output: undefined (hoặc lỗi)

