Prototype trong JavaScript là một khái niệm quan trọng và cơ bản, giúp hiểu rõ cách thức hoạt động của hệ thống kế thừa và chia sẻ phương thức giữa các đối tượng. Trong ngôn ngữ lập trình này, mọi đối tượng đều có một prototype, và khi không tìm thấy thuộc tính hoặc phương thức trong đối tượng, JavaScript sẽ tìm kiếm trong chuỗi nguyên mẫu (prototype chain). Việc nắm vững cách thức hoạt động của prototype giúp bạn tạo ra mã nguồn hiệu quả, tối ưu hóa bộ nhớ và dễ dàng mở rộng tính năng cho các dự án phức tạp.

1. Hiểu về Prototype trong JavaScript

Mỗi đối tượng trong JavaScript đều có một thuộc tính gọi là [[Prototype]], thường được truy cập thông qua thuộc tính __proto__ hoặc qua từ khóa prototype đối với các hàm tạo (constructor). Khi bạn cố gắng truy cập một thuộc tính hoặc phương thức của một đối tượng, nếu thuộc tính đó không tồn tại trong đối tượng, JavaScript sẽ tra cứu trong chuỗi nguyên mẫu (prototype chain) để tìm thuộc tính đó.

Ví dụ:

toString()

Ở đây, cả person1person2 đều sử dụng phương thức greet() thông qua prototype của Person. Điều này giúp tiết kiệm bộ nhớ vì phương thức greet không được sao chép nhiều lần cho từng đối tượng, mà chỉ tồn tại một lần trong prototype.

3. Prototype Chain (Chuỗi nguyên mẫu)

Khi bạn truy cập một thuộc tính hoặc phương thức trên một đối tượng, JavaScript sẽ tìm kiếm trong đối tượng đó trước. Nếu không tìm thấy, nó sẽ tiếp tục tìm kiếm trong prototype của đối tượng. Quá trình này lặp lại cho đến khi đến đối tượng gốc (Object.prototype) hoặc khi tìm thấy thuộc tính/phương thức đó.

Ví dụ:

toString()

Trong ví dụ này, Dog kế thừa từ Animal, vì vậy Dog có thể sử dụng phương thức speak() của Animal thông qua cơ chế prototype.

5. Kế thừa nhiều cấp (Multilevel Inheritance)

JavaScript hỗ trợ kế thừa nhiều cấp thông qua chuỗi prototype. Điều này có nghĩa là một đối tượng có thể kế thừa từ một đối tượng khác, và đối tượng đó lại có thể kế thừa từ một đối tượng khác nữa.

Ví dụ về kế thừa nhiều cấp:

Child

Dù cú pháp class dễ hiểu hơn, nhưng các phương thức trong class vẫn được lưu trữ trong prototype của đối tượng.

Kết luận

Prototype là nền tảng của hệ thống kế thừa trong JavaScript, cho phép các đối tượng chia sẻ các phương thức và thuộc tính. Hiểu rõ cách hoạt động của prototype giúp bạn tạo ra mã nguồn hiệu quả, tái sử dụng, và tối ưu hóa bộ nhớ trong các dự án phức tạp. Dù ES6 đã giới thiệu cú pháp class, bản chất của kế thừa trong JavaScript vẫn dựa trên cơ chế prototype.