Cách sử dụng access modifiers (public, private, protected)

Thumbnail Image

Access modifiers là một tính năng quan trọng trong TypeScript, giúp bạn kiểm soát quyền truy cập của thuộc tính và phương thức trong một lớp. Sử dụng các access modifiers này có thể giúp bảo mật code, giảm sự phức tạp và tăng tính chất lượng của code. Trong bài viết này, chúng ta sẽ tìm hiểu về cách sử dụng access modifiers trong TypeScript.

 

1. Giới thiệu về access modifiers trong TypeScript.

Access modifiers là các từ khóa trong TypeScript cho phép bạn kiểm soát quyền truy cập của các thuộc tính và phương thức trong một lớp (class). Có ba loại access modifiers trong TypeScript: public, private và protected.

- Public: Mặc định tất cả các thuộc tính và phương thức trong một lớp đều là public. Nghĩa là nó có thể truy cập bởi bất kỳ đối tượng nào từ bên ngoài.

- Private: Nếu một thuộc tính hoặc phương thức được khai báo với từ khóa private, nó chỉ có thể truy cập bên trong lớp đó.

- Protected: Tương tự như private, nhưng nó còn có thể truy cập bởi các lớp con kế thừa từ lớp đó.

Sử dụng access modifiers giúp bạn giữ mã nguồn của bạn sạch sẽ và dễ quản lý hơn bằng cách giới hạn quyền truy cập của các thuộc tính và phương thức.

 

2. Ví dụ minh họa cách sử dụng.

Public: Mặc định, nếu không có access modifier, thuộc tính và phương thức sẽ là public. Nó có thể truy cập từ bất kỳ nơi nào trong một class hoặc ngoài class.

class Vehicle {
  public make: string;
  public model: string;
  public year: number;

  public startEngine() {
    console.log("Engine started!");
  }
}

const car = new Vehicle();
car.make = "Toyota";
car.model = "Camry";
car.year = 2020;

console.log(`Make: ${car.make}, Model: ${car.model}, Year: ${car.year}`);
car.startEngine();
// Output:
// Make: Toyota, Model: Camry, Year: 2020
// Engine started!

Trong ví dụ trên, chúng ta đã sử dụng từ khóa public để khai báo các thuộc tính make, model, year và phương thức startEngine của đối tượng Vehicle. Do đó, chúng ta có thể truy cập và gán giá trị cho các thuộc tính này một cách dễ dàng từ bên ngoài.

Private: Thuộc tính và phương thức được khai báo là private sẽ chỉ có thể truy cập từ bên trong class.

class Vehicle {
  private make: string;
  private model: string;
  private year: number;

  private startEngine() {
    console.log("Engine started!");
  }
}

class Car extends Vehicle {
  public honk() {
    console.log("Beep beep!");
  }

  public printDetails() {
    console.log(`Make: ${this.make}, Model: ${this.model}, Year: ${this.year}`);
  }
}

const car = new Car();
car.make = "Toyota"; // Error: Property 'make' is private and only accessible within class 'Vehicle'.
car.startEngine(); // Error: Property 'startEngine' is private and only accessible within class 'Vehicle'.

Ở đây, ta sử dụng private để chỉ các thuộc tính và phương thức có thể truy cập được trong chính class Vehicle mà thôi. Nếu ta cố gắng truy cập các thuộc tính và phương thức này từ bên ngoài, sẽ báo lỗi.

Protected: Thuộc tính và phương thức được khai báo là protected sẽ có thể truy cập từ bên trong class và từ các class kế thừa nó.

class Vehicle {
  protected make: string;
  protected model: string;
  protected year: number;

  protected startEngine() {
    console.log("Engine started!");
  }
}

class Car extends Vehicle {
  public honk() {
    console.log("Beep beep!");
  }

  public printDetails() {
    console.log(`Make: ${this.make}, Model: ${this.model}, Year: ${this.year}`);
  }
}

const car = new Car();
car.make = "Toyota"; // Error: Property 'make' is protected and only accessible within class 'Vehicle' and its subclasses.
car.startEngine(); // Error: Property 'startEngine' is protected and only accessible within class 'Vehicle' and its subclasses.
car.printDetails(); // Output: Make: Toyota, Model: undefined, Year: undefined

Như vậy, chúng ta có thể thấy rằng, trong khi property và method make, model, year, startEngine được khai báo là protected, chúng chỉ có thể được truy cập từ class cha Vehicle và các lớp kế thừa của nó, trong trường hợp này là class Car.