Prototype và _proto_ trong JS là gì?

chào mọi người!
mình đang tìm hiểu JS thì bắt gặp khái niệm prototype, mình có đọc, xem search Youtube nhưng không có hiểu, Các bạn có giải thích cho mình tác dụng, vai trò của nó được ko ạ!
thanks so much!

Hiểu đơn giản là 1 tree, nhưng nối bị ngược từ leaf node đến root node. Mỗi __proto__ là 1 liên kết từ node con đến node cha.

Thường tree này được sử dụng trong built-in function [[GET]] để xác định thuộc tính hay hàm dựa trên tên sau dấu chấm, như object.property hoặc object.function().

6 Likes

bạn có thể nói mình! prototype là gì trong cái cây đó ạ?
và cái cành cây có phải là _proto_?
gốc gây đó là gì ạ

Sao bạn không đọc kĩ các giải thích trong document bằng tiếng Anh nhỉ. Bạn rất thích hỏi để hiểu đến tận chi tiết vấn đề tuy nhiên lại không có khả năng hấp thụ nó thì cố để làm gì. Những kiến thức bạn đang hỏi chưa phải là quan trọng và khó nuốt cho 1 newbie như bạn. Thay vì thế hãy học cách sử dụng trước, khi nào thành thạo rồi thì đào sâu thêm. Còn nhiều topic quan trọng hơn bạn cầ nắm rõ thay vì cái này

4 Likes

mình đọc rồi ko hiểu thì mới hỏi, mình đang đi học bạn lại bảo ko , mình quan tâm cái này, sao bắt mình quan tâm cái khác, kỳ z

Với JS với trình độ hiện tại của bạn thì chỉ nên học ở mức sau thôi:

  • prototype dùng để làm gì
  • cú pháp sử dụng
  • 1 số lưu ý

Khi nào kiến thức của bạn nhiều lên thì sẽ quay lại đào sâu cách hoạt động của prototype. Cách mà JS triển khai OOP dựa trên prototype

3 Likes

cách học mình khác, mỗi người 1 kiểu chứ

JS là OOP mọi thứ , vì vậy mình cần hiểu

cái quan trọng không phải là chỉ học mỗi 1 cái của 1 ngôn ngữ, trong 1 ngôn ngữ còn nhiều topic quan trọng hơn. Về detail implement của 1 tính năng đôi khi sẽ rất khó hiểu đối với người mới. Thay vì thế hãy học cách sử dụng, khi dùng nhiều kết hợp nhuần nhuyễn nhiều tính năng rồi thì quay lại nghiên cứu detail implement của các tính năng của ngôn ngữ.
PS: Mình không nói bạn quan tâm các vấn đề đã đề cập là vô ích, rất có ích tuy nhiên vấn đề là khi nào thì nên bắt đầu tìm hiểu. Thời gian mỗi ngừoi là có hạn, bạn phải biết chia sẻ nguồn lực dành thời gian vào các vấn đề quan trọng hơn để nhanh chóng có thể master 1 ngôn ngữ lập trình. (Sorry nếu mục tiêu của bạn học chỉ là để làm màu)

Không phải tự nhiên mà người ta phân các kiến thức dành cho các trình độ đâu bạn. Bạn đang đi vừa nhanh lại vừa chậm. Nhanh là nhảy ngay đến những kiến thức khó, chậm là bạn bỏ lỡ thời gian học những cái cơ bản khác.
Sẽ là vô ích nếu dạy tích phân, tính toán ma trận,… cho 1 đứa con nít. Phải không?

5 Likes

Topic này mình lập để hỏi cái câu kia, ko liên quan chuyện khác. đừng nói lạc đề ạ

mình hiểu rõ đang cần và tìm gì, bạn có thể giúp hoặc ko

cái JS mình học cũng gần 300 giờ rồi chứ ko phải nay mới học. nhưng để học và hiểu rõ library thì phải hiểu OOP trong JS, nếu ko thì phiền bạn đừng cmt nữa.

Prototype là __proto__ đó, có thể xem prototype là liên kết giữa 2 object, hay là edge từ node con sang node cha trong tree.

Đúng rồi, như trên.

Gốc cây là Object.prototype.


Mình nói về tree để bạn đọc dễ hiểu hơn thôi, chứ đa số tài liệu JS sẽ không nói về tree, mà chỉ tập trung xây dựng 1 prototype, rồi mở rộng prototype trên nhiều object. Rồi sau đó đưa ra khái niệm class hierarchy. Do đó, lần nào mình đọc tài liệu về prototype chain lúc nào nó cũng rối.

6 Likes

mình được là biết gần như mọi thứ trong JS là OOP, chúng ta hiểu 1 đối tượng là có 2 thứ, 1 là thuộc tính, 2 là phương thức.
như vậy trong JS, 1 biến được khởi tạo cũng là đối tượng, 1 mảng, 1 hàm, 1 lớp được khởi tạo cũng là 1 đối tượng phải ko ạ?, nhưng khi 1 lớp lại là 1 đối tượng thì rất rắc rối vì. khi tạo 1 lớp lúc đó chúng ta đang định nghĩa 1 kiểu dữ liệu mới, để tạo 1 đối tượng của lớp này.

2 Likes

JS không có class, cũng không có OOP.
Bạn càng áp dụng OOP vào JS nó sẽ càng rối đó.

Tất cả câu lệnh về OOP trong JS thì bạn nên quy về prototype chain.

5 Likes

JS ko có OOP đó là OOP CLASS mà bạn, còn OOP prototype_based, là đây là cái mình đang đi hỏi

cái này là cái gì, không hiểu lắm ?

class-based ý bạn …

bạn xem lại đi, chứ @hungaya nói chính xác rồi đó, theo kiến thức của mình cũng đồng ý với ý kiến trên. Còn bạn muốn hiểu sâu những cái này, bạn nên đọc series You Don’t Know JS, rất hay + chi tiết.

4 Likes

bạn ơi các object liên kết với nhau thông qua _proto_, vậy object con kế thừa mọi thứ từ object cha, câu hỏi đặt ra là : với prototype nút con có gì, thì khi đó cái object.prototype nó cũng có cái đó phải ko ạ?
theo CLASS _based thì ko có chuyện con setup 1 giá trị của thuộc tính, sau đó mặc định cha lại có

Phần kế thừa gì gì ấy, vì bạn chỉ cần xem cách [[GET]] hoạt động. Giải thuật đơn giản thế này, cho 1 câu lệnh đơn giản thôi object.property:

  1. Chuyển object.property thành [[GET]] (property, object)
  2. Kiểm tra property có nằm trong object hay không bằng object.hasOwnProperty(property)
  3. Nếu có thì trả về property trong object.
  4. Nếu không thì gọi tiếp kiểm tra trong object.__proto__, hay object.__proto__.hasOwnProperty(property).
  5. Nếu thấy thì trả về property trong object.__proto__. Còn không gì kiểm tra tiếp trong object.__proto__.__proto__.
  6. Kiểm tra property có trong root node Object.prototype không? Có thì trả về, không thì compiler báo lỗi.

Còn thừa kế gì gì đó nên dẹp sang 1 bên, coi thừa kế có khi nó rối. :v

7 Likes


mình hiểu là: prototype là 1 thuộc tính của Student trong trường hợp này.
đồng thời nó là dạng object, nên nó thêm được thuộc tính age cho nó.
nhưng tại sao khi khai báo 1 object: StudentObj2, thì Object này lại có thuộc tính age ạ?

Mỗi function đều có một thuộc tính object tên là prototype. Khi dùng function để tạo object, thì các object tạo ra sẽ bao gồm các thuộc tính và phương thức:

  • Được gán cho this ở trong function
  • Có trong function.prototype

Mỗi object tạo ra đó lại có một thuộc tính là __proto__, giữ tham chiếu tới thuộc tính prototype của function tạo ra nó. Vì vậy nên obj.__proto__ === Func.prototype là true.

Còn ví dụ của bạn tại sao StudentObj2 có thuộc tính age thì bạn xem lại câu trả lời ngay phía trên. JavaScript tìm age trong object không có sẽ tìm xuống StudentObj2.__proto__, ở đây thì nó tìm thấy nên nó sử dụng luôn.

6 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?