Trong bài hướng dẫn lần trước, ta đã tìm hiểu cách tạo một loại đối tượng để thể hiện hai đối tượng giống với Winston
rồi khởi chạy bằng hàm tạo.
Bây giờ, một loại đối tượng không chỉ liên kết với thuộc tính.
Nó còn có thể liên kết với chức năng. Hãy nghĩ về thế giới này và coi tất cả những loại chức năng trong đó
như con người. Ai cũng có cân nặng và tuổi tác, nhưng ta cũng có khả năng làm những thứ như ngủ, ăn, và lập trình.
Và ta muốn liên kết các hàm này với những loại đối tượng đó.
Trong chương trình này, cũng là chương trình mà ta đã làm việc từ lần trước, ta có một hàm,
drawWinston, mà ta gọi cho cả hai đối tượng Winston. Nếu ta có thể liên kết với loại đối tượng Winston
thì sẽ gọn gàng hơn đấy nhỉ? Hoàn toàn có thể đấy, và rất đơn giản.
Phía dưới hàm tạo, ta sẽ viết Winston – W viết hoa – chấm prototype,
và prototype đó, là từ mới mà chắc các bạn chưa từng nhìn thấy.
Prototype là một thuộc tính của đối tượng giúp ta có thể liên kết hàm
và điều đó có nghĩa là mọi đối tượng đóng vai trò instance sẽ liên kết với những hàm này.
Ta có thể nhập .prototype rồi chấm, tiếp đến tên hàm, như vậy ta nhập draw,
bằng, sau đó ta có thể lấy hàm drawWinston và
đưa vào trong đây. Được rồi vậy là ta đã liên kết một hàm draw
với prototype Winston. Điều đó có nghĩa là ta có thể gọi draw() trên bất cứ đối tượng Winston nào.
Được rồi, như vậy ta có thể gọi draw() trên winstonTeen hoặc winstonAdult.
Và khi đã có một hàm có khả năng gọi đối tượng như này,
ta gọi đó là “thủ tục”, hẳn các bạn đã từng nghe đến “thủ tục” rồi.
Vậy ta gọi đây là “thủ tục draw” đi. Được rồi.
Bây giờ ta sẽ xóa cái này, xóa cái này, và ta sẽ xem có gọi draw() được không.
winstonTeen.draw()
OK. Ở góc này có một thông báo lỗi, nội dung là “winstObject is not defined”.
Được rồi. Vậy, trước đó ta đã đưa đối số này vào drawWinston, tức đối tượng Winston
nhưng hiện tại ta không đưa vào nữa. Vì thế, ta có thể thay đổi cái này để đưa vào
và, ta sẽ nhập gì nhỉ? Ta sẽ phải đưa vào winstonTeen. Ok.
Thành công rồi, nhưng nhìn buồn cười quá. Tôi đã gọi hàm draw cho đối tượng rồi.
Đáng lẽ tôi không nên đưa cả đối tượng vào. Như vậy thừa quá.
Đúng vậy, đáng lẽ tôi không nên làm thế, vậy thì xóa thôi, bây giờ ta thử nghĩ nhé.
Nếu ta ở bên trong đối tượng, ta có thể sử dụng gì để tiếp cận thuộc tính của đối tượng?
Các bạn có thể nhìn vào hàm tạo, nhớ lại từ khóa đặc biệt “this” và thốt lên “à à”.
“Vậy nếu ta đổi cái này, thành cái này thì sao!” [cười] Như vậy ta đổi winstObject thành “this”.
Vì hiện tại ta đang ở bên trong đối tượng. Hàm này đang được đánh giá
trên đối tượng, vì vậy “this” sẽ tham chiếu tới đối tượng hiện tại.
Với cách đó ta chỉ cần nhập “this” và ta có thể tiếp cận tất cả mọi thuộc tính của đối tượng hiện tại.
Thấy chứ, ta thành công rồi. Thật thú vị phải không?
Sau đó ta có thể nhập winstonAdult.draw()
Tada! Và nó sẽ tiếp cận tới các thuộc tính của winstonAdult vì đó là đối tượng đang được gọi.
Đó là cái hay của từ khóa “this” này, mặc dù đôi khi hơi khó hiểu một chút.
Được rồi, vui thế đủ rồi, ta cùng thêm một thủ tục khác nhé. OK, Winston có thể làm gì nữa?
Cậu ta có thể nói chuyện chẳng hạn. Như vậy ta sẽ tạo Winston.prototype.talk, và ta có thể liên kết tới prototype bao nhiêu thủ tục cũng được.
Ta sẽ nhập “I’m Winston!”
Sau đó ta nhập this.s+20, và this.y+150.
Rồi, các bạn biết đấy, chẳng có gì xảy ra cả, nhưng tất nhiên đó là bởi tôi vẫn chưa gọi hàm.
Vậy cho phiên bản thiếu niên nói chuyện đi, winstonTeen.talk(). Các bạn tuổi teen nói chuyện liên mồm ấy.
I’m Winston, tada! Tiếp theo là winstonAdilt.talk().
Tada! Được rồi, hiện tại ta có loại đối tượng Winston mang các thuộc tính: nickname,
age, x, y; và có chức năng: behaviors, methods; đóng các vai trò khác nhau tùy theo thuộc tính.
Và ta có thể tạo bao nhiêu instance của Winston và gọi bất cừ thủ tục nào tùy thích.
Thật hay ho phải không?