-
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?