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:
greet
là 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ínhname
củ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:
greet
là một phương thức của Objectperson
.this.name
dùng để truy cập thuộc tínhname
bê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.name
trỏ đếnname
của Objectperson
. - Khi gọi
person.greet()
,this
trỏ đế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
),this
tronginnerFunction()
sẽ trỏ đếnwindow
(hoặcglobal
object trong Node.js). - Trong chế độ nghiêm ngặt (
strict mode
),this
sẽ 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ậythis
trong đó trỏ đếnwindow
(hoặcglobal
object trong Node.js), không phảiuser
.- Do đó,
this.name
sẽ 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)