JavaScript: JavaScript Private Methods
Tổng quan
Trong hướng dẫn này, bạn sẽ tìm hiểu về các phương thức private của JavaScript bao gồm các phương thức instance private, các phương thức tĩnh private và getter/setter private.
Giới thiệu về phương thức private trong Javascript
Theo mặc định, các thành viên của một lớp là public. ES2020 đã giới thiệu các thành viên private trong một lớp bao gồm các trường private và phương thức private.
Để đặt một phương thức public ở chế độ private, bạn đặt trước tên của nó kí hiệu #. JavaScript cho phép bạn xác định các phương thức private cho các phương thức instance, phương thức tĩnh và phương thức getter/setters .
Sau đây cho thấy cú pháp xác định một phương thức instance private:
class MyClass { #privateMethod() { //... } }
Trong ví dụ trên đây, #privateMethod là một phương thức instance được đặt ở quyền truy cập private. Nó chỉ có thể được gọi bên trong MyClass. Nói cách khác, nó không thể được gọi từ bên ngoài lớp MyClass hoặc trong các lớp con của MyClass.
Để gọi #privateMethod bên trong MyClass, bạn sử dụng từ khóa this như sau:
this.#privateMethod();
Sau đây là ví dụ minh họa cú pháp xác định một phương thức tĩnh private:
class MyClass { static #privateStaticMethod() { //... } }
Để gọi #privateStaticMethod() bên trong MyClass, bạn sử dụng tên lớp thay vì từ khóa this:
MyClass.#privateStaticMethod();
Ví dụ sau đây trình bày cú pháp của getters/setters private:
class MyClass { #field; get #myField() { return #field; } set #myField(value){ #field = value; } }
Trong ví dụ trên, #myFieldgetter và setter private cung cấp quyền truy cập vào trường private #field. Trong thực tế, bạn sử dụng các phương thức private để giảm thiểu số lượng phương thức mà đối tượng hiển thị. Theo nguyên tắc chung, trước tiên bạn nên đặt tất cả các phương thức lớp ở chế độ private theo mặc định. Và sau đó bạn đặt một phương thức ở chế độ public bất cứ khi nào đối tượng cần sử dụng phương thức đó để tương tác với các đối tượng khác.
Ví dụ về phương thức private của JavaScript
Ví dụ về phương thức instance private
Đoạn mã sau đây minh họa cách định nghĩa lớp Person bằng các phương thức instance private:
class Person { #firstName; #lastName; constructor(firstName, lastName) { this.#firstName = firstName; this.#lastName = lastName; } getFullName(format = true) { return format ? this.#firstLast() : this.#lastFirst(); } #firstLast() { return `${this.#firstName} ${this.#lastName}`; } #lastFirst() { return `${this.#lastName}, ${this.#firstName}`; } } let person = new Person('John', 'Doe'); console.log(person.getFullName()); // John Doe
Trong ví dụ này:
Đầu tiên, xác định hai trường private #firstName và #lastName trong nội dung lớp Person.
Thứ hai, xác định các phương thức private #firstLast() và #lastFirst(). Các phương thức này trả về tên đầy đủ ở các định dạng khác nhau.
Thứ ba, xác định phương thức public instance getFullName() trả về tên đầy đủ của một người. Phương thức getFullName() này gọi phương thức private #firstLast() và #lastFirst() và trả về tên đầy đủ.
Cuối cùng, tạo một đối tượng Person mới và xuất tên đầy đủ ra console.
Ví dụ về phương thức tĩnh private
Mã sau đây thêm phương thức tĩnh private #validate() vào lớp Person
class Person { #firstName; #lastName; constructor(firstName, lastName) { this.#firstName = Person.#validate(firstName); this.#lastName = Person.#validate(lastName); } getFullName(format = true) { return format ? this.#firstLast() : this.#lastFirst(); } static #validate(name) { if (typeof name === 'string') { let str = name.trim(); if (str.length >= 3) { return str; } } throw 'The name must be a string with at least 3 characters'; } #firstLast() { return `${this.#firstName} ${this.#lastName}`; } #lastFirst() { return `${this.#lastName}, ${this.#firstName}`; } } let person = new Person('John', 'Doe'); console.log(person.getFullName());
:Đầu tiên, xác định phương thức tĩnh #validate()
trả về một giá trị nếu đó là một chuỗi có ít nhất ba ký tự. Phương thức này đưa ra một Exception khi không nhận được một string có ít nhất 3 kí tự.
Thứ hai, gọi phương thức tĩnh private #validate() trong hàm tạo để xác thực các đối số firstName
và lastName
trước khi gán chúng cho các thuộc tính private tương ứng.
Tóm tắt
- Đặt tiền tố # trước tên phương thức để đặt nó ở chế độ private.
- Các phương thức private chỉ có thể được gọi bên trong lớp, không phải từ bên ngoài lớp hoặc trong các lớp con.