Lập trình hướng đối tượng (Object-Oriented Programming - OOP) không chỉ là một khái niệm học thuật, mà là nền tảng tư duy cốt lõi để xây dựng các hệ thống phần mềm lớn, dễ bảo trì và mở rộng. Nếu bạn đang hướng đến mục tiêu trở thành một Senior Developer, việc làm chủ tư duy thiết kế phần mềm chuyên nghiệp với OOP là điều bắt buộc.

Mặc dù JavaScript (từ ES6) đã hỗ trợ từ khóa class, nhưng bản chất nó vẫn là Prototype-based và thiếu đi những ràng buộc chặt chẽ. TypeScript ra đời và thay đổi hoàn toàn cục diện, mang đến một hệ sinh thái OOP hoàn thiện, mạnh mẽ và an toàn không kém gì Java hay C#.

Bài viết này sẽ là "kim chỉ nam" giúp bạn làm chủ Lập trình hướng đối tượng TypeScript từ cơ bản đến nâng cao.

Class và Object: Nền Tảng Của Mọi Thứ

Trong OOP, Class (Lớp) đóng vai trò như một bản thiết kế (blueprint), còn Object (Đối tượng) là một thực thể cụ thể được tạo ra từ bản thiết kế đó. TypeScript giúp việc định nghĩa cấu trúc của Class trở nên rõ ràng và an toàn hơn bao giờ hết nhờ hệ thống kiểm tra kiểu dữ liệu (static typing).

class Product {
  name: string;
  price: number;

  constructor(name: string, price: number) {
    this.name = name;
    this.price = price;
  }

  showInfo(): string {
    return `Sản phẩm: ${this.name} - Giá: ${this.price}$`;
  }
}

const laptop = new Product("MacBook Pro", 2000); // Khởi tạo Object

Các Cấp Độ Truy Cập (Access Modifiers) - Sức Mạnh Của Sự Đóng Gói

Sự khác biệt lớn nhất giữa OOP TypeScript và JavaScript thuần chính là khả năng kiểm soát quyền truy cập dữ liệu thông qua các Access Modifiers. Tính năng này đại diện cho Tính đóng gói (Encapsulation), giúp bảo vệ dữ liệu khỏi những can thiệp không mong muốn từ bên ngoài.

  • public (Mặc định): Có thể truy cập từ bất cứ đâu.

  • private: Chỉ có thể truy cập ở bên trong chính Class định nghĩa ra nó.

  • protected: Có thể truy cập ở bên trong Class đó và các Class con kế thừa từ nó.

class BankAccount {
  public accountName: string;
  private balance: number; // Không thể truy cập trực tiếp từ bên ngoài

  constructor(name: string, initialBalance: number) {
    this.accountName = name;
    this.balance = initialBalance;
  }
}

Setter và Getter: Giao Tiếp Dữ Liệu An Toàn

Khi bạn ẩn các thuộc tính bằng private, làm thế nào để lấy hoặc thay đổi giá trị của chúng? Câu trả lời chính là SetterGetter. Đây là các phương thức đặc biệt giúp bạn kiểm tra logic, validate dữ liệu trước khi cho phép gán hoặc đọc giá trị.

class User {
  private _age: number = 0;

  get age(): number {
    return this._age;
  }

  set age(value: number) {
    if (value < 0) {
      throw new Error("Tuổi không được âm!");
    }
    this._age = value;
  }
}

Tính Kế Thừa (Inheritance) và Tính Đa Hình (Polymorphism)

OOP cho phép bạn tái sử dụng code một cách triệt để thông qua Tính kế thừa. Một Class con có thể kế thừa (sử dụng lại) tất cả các thuộc tính và phương thức (không phải private) từ Class cha thông qua từ khóa extends.

Đi kèm với kế thừa là Tính đa hình. Class con có quyền ghi đè (override) lại các phương thức của Class cha để thực hiện các hành vi đặc thù riêng, giúp các đối tượng khác nhau có thể phản hồi cùng một phương thức theo những cách khác nhau.

class Animal {
  makeSound(): void {
    console.log("Some generic sound");
  }
}

class Dog extends Animal {
  // Ghi đè phương thức (Đa hình)
  override makeSound(): void {
    console.log("Gâu gâu!");
  }
}

Abstract Class: Bản Thiết Kế Tối Cao

Nếu bạn có một Class chứa những đặc điểm chung nhất, nhưng bạn không bao giờ muốn khởi tạo trực tiếp một Object từ Class đó (ví dụ: Class HinhHoc), hãy dùng Abstract Class (Lớp trừu tượng).

Nó thường chứa các phương thức trừu tượng (không có phần thân code) bắt buộc các Class con khi kế thừa phải tự triển khai chi tiết.

abstract class Shape {
  abstract calculateArea(): number; // Bắt buộc class con phải định nghĩa
}

class Circle extends Shape {
  constructor(private radius: number) {
    super();
  }
  calculateArea(): number {
    return Math.PI * this.radius ** 2;
  }
}

Đã Đến Lúc Nâng Tầm Kỹ Năng Của Bạn!

Lập trình hướng đối tượng là một kỹ năng bắt buộc để tiến lên các vị trí Senior. Việc chỉ nắm vững cú pháp bề mặt là chưa đủ, bạn cần biết cách vận dụng kiến trúc này vào các dự án có độ phức tạp cao.

Nếu bạn đang tìm kiếm một lộ trình bài bản, hãy tham khảo Khóa học TypeScript của Unicode Academy. Toàn bộ Module 02 (gồm 18 bài giảng) được thiết kế riêng để dạy bạn tư duy OOP thực chiến. Không chỉ dừng lại ở lý thuyết, bạn sẽ được:

  • Thực hành trực tiếp xây dựng kiến trúc thông qua Mini Project - Product Manager.

  • Tiếp cận các Design Pattern và kỹ thuật nâng cao thường dùng trong các hệ thống lớn như: Dependency Injection hay Function Overloading.

Đầu tư vào tư duy hệ thống chính là bước đệm vững chắc nhất để viết ra những dòng code sạch, an toàn và chuyên nghiệp!