[Script Info] Title: [Events] Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text Dialogue: 0,0:00:00.78,0:00:06.23,Default,,0000,0000,0000,,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 Dialogue: 0,0:00:06.23,0:00:09.23,Default,,0000,0000,0000,,rồi khởi chạy bằng hàm tạo. Dialogue: 0,0:00:09.23,0:00:13.47,Default,,0000,0000,0000,,Bây giờ, một loại đối tượng không chỉ liên kết với thuộc tính. Dialogue: 0,0:00:13.47,0:00:18.81,Default,,0000,0000,0000,,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 đó Dialogue: 0,0:00:18.81,0:00:26.29,Default,,0000,0000,0000,,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. Dialogue: 0,0:00:26.29,0:00:30.94,Default,,0000,0000,0000,,Và ta muốn liên kết các hàm này với những loại đối tượng đó. Dialogue: 0,0:00:30.94,0:00:35.95,Default,,0000,0000,0000,,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, Dialogue: 0,0:00:35.95,0:00:43.07,Default,,0000,0000,0000,,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 Dialogue: 0,0:00:43.07,0:00:48.57,Default,,0000,0000,0000,,thì sẽ gọn gàng hơn đấy nhỉ? Hoàn toàn có thể đấy, và rất đơn giản. Dialogue: 0,0:00:48.57,0:00:55.72,Default,,0000,0000,0000,,Phía dưới hàm tạo, ta sẽ viết Winston – W viết hoa – chấm prototype, Dialogue: 0,0:00:55.72,0:00:59.23,Default,,0000,0000,0000,,và prototype đó, là từ mới mà chắc các bạn chưa từng nhìn thấy. Dialogue: 0,0:00:59.23,0:01:05.88,Default,,0000,0000,0000,,Prototype là một thuộc tính của đối tượng giúp ta có thể liên kết hàm Dialogue: 0,0:01:05.88,0:01:13.31,Default,,0000,0000,0000,,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. Dialogue: 0,0:01:13.31,0:01:19.61,Default,,0000,0000,0000,,Ta có thể nhập .prototype rồi chấm, tiếp đến tên hàm, như vậy ta nhập draw, Dialogue: 0,0:01:19.61,0:01:25.61,Default,,0000,0000,0000,,bằng, sau đó ta có thể lấy hàm drawWinston và Dialogue: 0,0:01:25.61,0:01:32.95,Default,,0000,0000,0000,,đưa vào trong đây. Được rồi vậy là ta đã liên kết một hàm draw Dialogue: 0,0:01:32.95,0:01:40.01,Default,,0000,0000,0000,,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. Dialogue: 0,0:01:40.01,0:01:45.41,Default,,0000,0000,0000,,Được rồi, như vậy ta có thể gọi draw() trên winstonTeen hoặc winstonAdult. Dialogue: 0,0:01:45.41,0:01:49.57,Default,,0000,0000,0000,,Và khi đã có một hàm có khả năng gọi đối tượng như này, Dialogue: 0,0:01:49.57,0:01:54.83,Default,,0000,0000,0000,,ta gọi đó là “thủ tục”, hẳn các bạn đã từng nghe đến “thủ tục” rồi. Dialogue: 0,0:01:54.83,0:01:58.27,Default,,0000,0000,0000,,Vậy ta gọi đây là “thủ tục draw” đi. Được rồi. Dialogue: 0,0:01:58.27,0:02:04.10,Default,,0000,0000,0000,,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. Dialogue: 0,0:02:04.10,0:02:07.07,Default,,0000,0000,0000,,winstonTeen.draw() Dialogue: 0,0:02:07.07,0:02:13.70,Default,,0000,0000,0000,,OK. Ở góc này có một thông báo lỗi, nội dung là “winstObject is not defined”. Dialogue: 0,0:02:13.70,0:02:20.53,Default,,0000,0000,0000,,Được rồi. Vậy, trước đó ta đã đưa đối số này vào drawWinston, tức đối tượng Winston Dialogue: 0,0:02:20.53,0:02:26.46,Default,,0000,0000,0000,,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 Dialogue: 0,0:02:26.46,0:02:30.82,Default,,0000,0000,0000,,và, ta sẽ nhập gì nhỉ? Ta sẽ phải đưa vào winstonTeen. Ok. Dialogue: 0,0:02:30.82,0:02:38.44,Default,,0000,0000,0000,,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. Dialogue: 0,0:02:38.44,0:02:43.96,Default,,0000,0000,0000,,Đáng lẽ tôi không nên đưa cả đối tượng vào. Như vậy thừa quá. Dialogue: 0,0:02:43.96,0:02:48.46,Default,,0000,0000,0000,,Đú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é. Dialogue: 0,0:02:48.46,0:02:54.40,Default,,0000,0000,0000,,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? Dialogue: 0,0:02:54.40,0:03:00.37,Default,,0000,0000,0000,,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 “à à”. Dialogue: 0,0:03:00.37,0:03:08.57,Default,,0000,0000,0000,,“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”. Dialogue: 0,0:03:08.57,0:03:12.95,Default,,0000,0000,0000,,Vì hiện tại ta đang ở bên trong đối tượng. Hàm này đang được đánh giá Dialogue: 0,0:03:12.95,0:03:16.86,Default,,0000,0000,0000,,trên đối tượng, vì vậy “this” sẽ tham chiếu tới đối tượng hiện tại. Dialogue: 0,0:03:16.86,0:03:23.27,Default,,0000,0000,0000,,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. Dialogue: 0,0:03:23.27,0:03:26.72,Default,,0000,0000,0000,,Thấy chứ, ta thành công rồi. Thật thú vị phải không? Dialogue: 0,0:03:26.72,0:03:31.91,Default,,0000,0000,0000,,Sau đó ta có thể nhập winstonAdult.draw() Dialogue: 0,0:03:31.91,0:03:38.27,Default,,0000,0000,0000,,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. Dialogue: 0,0:03:38.27,0:03:45.75,Default,,0000,0000,0000,,Đó 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. Dialogue: 0,0:03:45.75,0:03:52.03,Default,,0000,0000,0000,,Đượ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? Dialogue: 0,0:03:52.03,0:04:01.08,Default,,0000,0000,0000,,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. Dialogue: 0,0:04:01.08,0:04:05.24,Default,,0000,0000,0000,,Ta sẽ nhập “I’m Winston!” Dialogue: 0,0:04:05.24,0:04:13.18,Default,,0000,0000,0000,,Sau đó ta nhập this.s+20, và this.y+150. Dialogue: 0,0:04:13.18,0:04:19.73,Default,,0000,0000,0000,,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. Dialogue: 0,0:04:19.73,0:04:25.07,Default,,0000,0000,0000,,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. Dialogue: 0,0:04:25.07,0:04:30.48,Default,,0000,0000,0000,,I’m Winston, tada! Tiếp theo là winstonAdilt.talk(). Dialogue: 0,0:04:30.48,0:04:36.83,Default,,0000,0000,0000,,Tada! Được rồi, hiện tại ta có loại đối tượng Winston mang các thuộc tính: nickname, Dialogue: 0,0:04:36.83,0:04:45.03,Default,,0000,0000,0000,,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. Dialogue: 0,0:04:45.03,0:04:50.100,Default,,0000,0000,0000,,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. Dialogue: 0,0:04:50.100,0:00:00.00,Default,,0000,0000,0000,,Thật hay ho phải không?