Prototype-in-javascript

Prototype trong JavaScript

Javascript không có class như các ngôn ngữ khác như C#, Java … JavaScript có một thứ khác để các Object thừa kế các property – đó là prototype.

Hiểu một cách trực quan thì prototype là cha của một object. Ở bài về object mình đã nói mọi thứ trong JS đều là object (trừ null và undefined) đều là object, mỗi object sẽ có một thằng cha (prototype) của nó. Array thì prototype của nó là Array.prototype, cha của string là String.prototype.

Một điểm nữa là mỗi thằng cha sẽ có một thằng cha khác, thằng cha khác này cũng có một thằng cha khác nữa …

prototype - cha - con

Vậy thì có thằng nào là cha của tất cả không? – Câu trả lời là có, thằng đó là Object.prototype, thằng này là trùm cuối, không có thằng nào là cha của nó nữa.

Check this:

Hình ảnh trực quan của prototype cho các bạn đây

 prototype-of-array.png

Cái quan hệ thừa kế trong JS thuộc loại dynamic, nghĩa là thằng con thừa kế thuộc tính từ thằng cha, nếu ta thêm cho thằng cha một thuộc tính nào đó thì thằng con nó cũng xài được cái thuộc tính đó luôn mà không cần bàn cãi nhiều. Như ví dụ sau, ta thêm phương thức Bubble Sort cho Array prototype, và tạo một array mới, array này có cha là Array.prototype => array mới có thể sử dụng được Bubble Sort mà ta thêm vào cho prototype.

Với prototype ta có thể hiện thực được việc thừa kế trong JS. Để thực hiện việc này ta có thể tự tay tạo mới phương thức usePrototype cho Object hoặc sử dụng Object.create(). Bạn nên đọc cái phương thức usePrototype để biết Object.create() làm việc như thế nào :v

Chú ý rằng khi ta thay đổi trong cái object thừa kế thì trong object được thừa kế nó vẫn không thay đổi.

Liên quan một xíu đến bài Object, ta có cách tạo Object bằng Object literal và Object constructor. Đối với Object Literal thì sau khi tạo, prototype của object đó là Object.prototype, là thằng trùm cuối ấy, còn nếu ta tạo Object bằng Object constructor thì Object được tạo ra sẽ có prototype mới, cái mới này được kế thừa từ Object.prototype (trùm cuối mà, thằng nào chả kế thừa từ nó).

Check this:

Oke, quay lại với mớ cha con trên kia. Khi ta truy xuất đến một thuộc tính của thằng con, nếu nó không có, nó sẽ đi hỏi thằng cha, nếu thằng cha không có thì hỏi lên thằng cha ở trên nữa, …. cứ thế cho đến Object.prototype – trùm cuối, nếu trùm cuối không có thì nó trả về undefined và gây lỗi TypeError nếu cái thuộc tính đó ta truy xuất đó là function, còn có ở cha nào thì cha nấy trả về cho con nó xài. Vụ này cũng same same với scope chain nhỉ, nó được gọi là prototype chain.

Click vào hình để đến nguồn hình

 

Xong rồi, có lỗi nào trong bài comment cho mình biết với nhé, để sau này đi code mình không code tào lao, mình đi ngủ đây, chúc các bạn code vui vẻ !! …

Leave a Reply

Your email address will not be published. Required fields are marked *