0:00:00.780,0:00:06.234 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 0:00:06.234,0:00:09.234 rồi khởi chạy bằng hàm tạo. 0:00:09.234,0:00:13.472 Bây giờ, một loại đối tượng không chỉ liên kết với thuộc tính. 0:00:13.472,0:00:18.806 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 đó 0:00:18.806,0:00:26.287 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. 0:00:26.287,0:00:30.939 Và ta muốn liên kết các hàm này với những loại đối tượng đó. 0:00:30.939,0:00:35.949 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, 0:00:35.949,0:00:43.066 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 0:00:43.066,0:00:48.569 thì sẽ gọn gàng hơn đấy nhỉ? Hoàn toàn có thể đấy, và rất đơn giản. 0:00:48.569,0:00:55.725 Phía dưới hàm tạo, ta sẽ viết Winston – W viết hoa – chấm prototype, 0:00:55.725,0:00:59.232 và prototype đó, là từ mới mà chắc các bạn chưa từng nhìn thấy. 0:00:59.232,0:01:05.881 Prototype là một thuộc tính của đối tượng giúp ta có thể liên kết hàm 0:01:05.881,0:01:13.309 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. 0:01:13.309,0:01:19.612 Ta có thể nhập .prototype rồi chấm, tiếp đến tên hàm, như vậy ta nhập draw, 0:01:19.612,0:01:25.606 bằng, sau đó ta có thể lấy hàm drawWinston và 0:01:25.606,0:01:32.951 đưa vào trong đây. Được rồi vậy là ta đã liên kết một hàm draw 0:01:32.951,0:01:40.008 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. 0:01:40.008,0:01:45.411 Được rồi, như vậy ta có thể gọi draw() trên winstonTeen hoặc winstonAdult. 0:01:45.411,0:01:49.569 Và khi đã có một hàm có khả năng gọi đối tượng như này, 0:01:49.569,0:01:54.833 ta gọi đó là “thủ tục”, hẳn các bạn đã từng nghe đến “thủ tục” rồi. 0:01:54.833,0:01:58.272 Vậy ta gọi đây là “thủ tục draw” đi. Được rồi. 0:01:58.272,0:02:04.103 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. 0:02:04.103,0:02:07.069 winstonTeen.draw() 0:02:07.069,0:02:13.697 OK. Ở góc này có một thông báo lỗi, nội dung là “winstObject is not defined”. 0:02:13.697,0:02:20.530 Được rồi. Vậy, trước đó ta đã đưa đối số này vào drawWinston, tức đối tượng Winston 0:02:20.530,0:02:26.462 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 0:02:26.462,0:02:30.819 và, ta sẽ nhập gì nhỉ? Ta sẽ phải đưa vào winstonTeen. Ok. 0:02:30.819,0:02:38.441 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. 0:02:38.441,0:02:43.965 Đáng lẽ tôi không nên đưa cả đối tượng vào. Như vậy thừa quá. 0:02:43.965,0:02:48.465 Đú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é. 0:02:48.465,0:02:54.404 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? 0:02:54.404,0:03:00.374 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 “à à”. 0:03:00.374,0:03:08.573 “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”. 0:03:08.573,0:03:12.951 Vì hiện tại ta đang ở bên trong đối tượng. Hàm này đang được đánh giá 0:03:12.951,0:03:16.861 trên đối tượng, vì vậy “this” sẽ tham chiếu tới đối tượng hiện tại. 0:03:16.861,0:03:23.271 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. 0:03:23.271,0:03:26.720 Thấy chứ, ta thành công rồi. Thật thú vị phải không? 0:03:26.720,0:03:31.907 Sau đó ta có thể nhập winstonAdult.draw() 0:03:31.907,0:03:38.271 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. 0:03:38.271,0:03:45.752 Đó 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. 0:03:45.752,0:03:52.028 Đượ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? 0:03:52.028,0:04:01.078 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. 0:04:01.078,0:04:05.241 Ta sẽ nhập “I’m Winston!” 0:04:05.241,0:04:13.181 Sau đó ta nhập this.s+20, và this.y+150. 0:04:13.181,0:04:19.733 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. 0:04:19.733,0:04:25.068 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. 0:04:25.068,0:04:30.479 I’m Winston, tada! Tiếp theo là winstonAdilt.talk(). 0:04:30.479,0:04:36.828 Tada! Được rồi, hiện tại ta có loại đối tượng Winston mang các thuộc tính: nickname, 0:04:36.828,0:04:45.026 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. 0:04:45.026,0:04:50.999 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. 0:04:50.999,0:00:00.000 Thật hay ho phải không?