JavaScript - Phương thức tĩnh

Xin chào các bạn tương lai của các pháp sư JavaScript! Hôm nay, chúng ta sẽ cùng lặn sâu vào thế giới fascinante của các phương thức tĩnh. Đừng lo lắng nếu bạn mới bắt đầu học lập trình - Tôi sẽ hướng dẫn bạn từng bước, giống như tôi đã làm cho hàng trăm sinh viên trong những năm dạy học của mình. Vậy, hãy lấy một tách cà phê (hoặc đồ uống yêu thích của bạn), và cùng nhau bắt đầu hành trình thú vị này!

JavaScript - Static Methods

Phương thức tĩnh là gì?

Định nghĩa và Mục đích

Phương thức tĩnh là một loại phương thức đặc biệt trong JavaScript mà thuộc về lớp本身的,而不是属于类的任何特定实例。 Hãy nghĩ chúng như là các hàm tiện ích liên quan đến lớp nhưng không cần truy cập dữ liệu của bất kỳ đối tượng nào.

Hãy tưởng tượng một hộp công cụ (lớp của chúng ta) với nhiều công cụ bên trong. Một số công cụ (phương thức thông thường) được sử dụng trên các đối tượng cụ thể, trong khi những công cụ khác (phương thức tĩnh) là các công cụ通用 mà có thể sử dụng mà không cần một đối tượng cụ thể.

Cú pháp

Để tạo một phương thức tĩnh, chúng ta sử dụng từ khóa static trước tên phương thức. Dưới đây là cú pháp cơ bản:

class ClassName {
static methodName() {
// Thân phương thức
}
}

Đặc điểm chính

  1. Các phương thức tĩnh được gọi trên lớp itself, không phải trên các thực thể của lớp.
  2. Chúng không thể truy cập dữ liệu cụ thể của thực thể (tức là chúng không thể sử dụng this để tham chiếu đến các thuộc tính của đối tượng).
  3. Chúng thường được sử dụng cho các hàm tiện ích liên quan đến lớp.

Bây giờ chúng ta đã có một sự hiểu biết cơ bản, hãy cùng xem một số ví dụ để thực sự hiểu rõ khái niệm này.

Ví dụ

Ví dụ 1: Máy tính đơn giản

Hãy tạo một lớp Calculator với một số phương thức tĩnh:

class Calculator {
static add(a, b) {
return a + b;
}

static subtract(a, b) {
return a - b;
}

static multiply(a, b) {
return a * b;
}

static divide(a, b) {
if (b === 0) {
return "Lỗi: Chia cho không";
}
return a / b;
}
}

// Sử dụng các phương thức tĩnh
console.log(Calculator.add(5, 3));      // Output: 8
console.log(Calculator.subtract(10, 4)); // Output: 6
console.log(Calculator.multiply(2, 6));  // Output: 12
console.log(Calculator.divide(15, 3));   // Output: 5
console.log(Calculator.divide(10, 0));   // Output: Lỗi: Chia cho không

Trong ví dụ này, chúng ta đã tạo một lớp Calculator với bốn phương thức tĩnh: add, subtract, multiply, và divide. Lưu ý rằng chúng ta gọi các phương thức này trực tiếp trên lớp Calculator, mà không cần tạo một thực thể của lớp.

Những phương thức này là ứng cử viên hoàn hảo cho các phương thức tĩnh vì chúng thực hiện các phép toán tổng quát mà không cần dữ liệu cụ thể của đối tượng.

Ví dụ 2: Định dạng ngày

Hãy tạo một lớp DateFormatter với một phương thức tĩnh để định dạng ngày:

class DateFormatter {
static formatDate(date) {
const day = String(date.getDate()).padStart(2, '0');
const month = String(date.getMonth() + 1).padStart(2, '0'); // Tháng được tính từ 0
const year = date.getFullYear();

return `${day}/${month}/${year}`;
}
}

const today = new Date();
console.log(DateFormatter.formatDate(today)); // Output: Ngày hiện tại theo định dạng DD/MM/YYYY

Trong ví dụ này, phương thức formatDate tĩnh của chúng ta nhận một đối tượng Date và trả về một chuỗi định dạng. Chúng ta có thể sử dụng phương thức này mà không cần tạo một thực thể của DateFormatter, điều này rất tiện lợi cho các nhiệm vụ định dạng ngày nhanh chóng.

Ví dụ 3: Trình tạo số ngẫu nhiên

Hãy tạo một lớp RandomGenerator với các phương thức tĩnh để tạo số ngẫu nhiên:

class RandomGenerator {
static getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min + 1)) + min;
}

static getRandomFloat(min, max) {
return Math.random() * (max - min) + min;
}

static getRandomBoolean() {
return Math.random() < 0.5;
}
}

console.log(RandomGenerator.getRandomInt(1, 10));    // Output: Số nguyên ngẫu nhiên giữa 1 và 10
console.log(RandomGenerator.getRandomFloat(0, 1));   // Output: Số float ngẫu nhiên giữa 0 và 1
console.log(RandomGenerator.getRandomBoolean());     // Output: true hoặc false ngẫu nhiên

Lớp RandomGenerator này cung cấp các phương thức tiện ích để tạo các giá trị ngẫu nhiên khác nhau. Những phương thức này không cần dữ liệu cụ thể của đối tượng, làm chúng trở thành ứng cử viên hoàn hảo cho các phương thức tĩnh.

Ví dụ 4: Tiện ích chuỗi

Hãy tạo một lớp StringUtils với một số phương thức tĩnh hữu ích cho việc xử lý chuỗi:

class StringUtils {
static capitalize(str) {
return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
}

static reverse(str) {
return str.split('').reverse().join('');
}

static countVowels(str) {
return (str.match(/[aeiou]/gi) || []).length;
}
}

console.log(StringUtils.capitalize("hELLO")); // Output: "Hello"
console.log(StringUtils.reverse("JavaScript")); // Output: "tpircSavaJ"
console.log(StringUtils.countVowels("Beautiful")); // Output: 5

Những phương thức tiện ích chuỗi này là những ví dụ tuyệt vời của các phương thức tĩnh. Chúng thực hiện các thao tác trên chuỗi mà không cần dữ liệu cụ thể của đối tượng.

Khi nào nên sử dụng phương thức tĩnh

Phương thức tĩnh đặc biệt hữu ích trong các tình huống sau:

  1. Các hàm tiện ích không yêu cầu trạng thái đối tượng.
  2. Các phương thức工厂 để tạo các thực thể của lớp.
  3. Các thao tác liên quan đến lớp nhưng không phụ thuộc vào dữ liệu của thực thể.

Bảng tóm tắt các phương thức tĩnh

Dưới đây là tóm tắt các phương thức tĩnh chúng ta đã xem trong các ví dụ:

Lớp Phương thức Mô tả
Calculator add(a, b) Cộng hai số
Calculator subtract(a, b) Trừ số thứ hai khỏi số thứ nhất
Calculator multiply(a, b) Nhân hai số
Calculator divide(a, b) Chia số thứ nhất cho số thứ hai
DateFormatter formatDate(date) Định dạng một ngày thành DD/MM/YYYY
RandomGenerator getRandomInt(min, max) Tạo một số nguyên ngẫu nhiên
RandomGenerator getRandomFloat(min, max) Tạo một số float ngẫu nhiên
RandomGenerator getRandomBoolean() Tạo một số boolean ngẫu nhiên
StringUtils capitalize(str) Viết hoa chữ cái đầu tiên của chuỗi
StringUtils reverse(str) Đảo ngược chuỗi
StringUtils countVowels(str) Đếm số nguyên âm trong chuỗi

Và thế là chúng ta đã khám phá thế giới của các phương thức tĩnh trong JavaScript, từ định nghĩa cơ bản đến các ví dụ thực tế. Nhớ rằng các phương thức tĩnh giống như những con dao Thụy Sĩ trong hộp công cụ JavaScript của bạn - chúng linh hoạt, tiện lợi và không cần đối tượng cụ thể để thực hiện công việc của mình.

Khi bạn tiếp tục hành trình học JavaScript, bạn sẽ tìm thấy nhiều ứng dụng khác cho các phương thức tĩnh. Chúng là một tính năng mạnh mẽ có thể làm cho mã của bạn sạch sẽ và tổ chức hơn. Vậy hãy tiếp tục lập trình, các bạn ơi, và mong rằng các phương thức tĩnh của bạn luôn hữu ích và lỗi bug ít ỏi!

Credits: Image by storyset