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.
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 đó.
toString()
Ở đây, cả person1
và person2
đề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.
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 đó.
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.
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.
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.
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.