Hướng dẫn this in class javascript - cái này trong javascript lớp
Hôm nay mình sẽ giới thiệu với bạn về class trong JavaScript. Class được tạo ra như thế nào? Sử dụng class ra sao. Hãy theo dõi nhé!class trong JavaScript. Class được tạo ra như thế nào? Sử dụng class ra sao. Hãy theo dõi nhé! Show
Nội dung chính ShowShow
1. Class là gì?2. Constructor là gì? có thể hiểu là một khuôn mẫu. 3. Phương thức getter và setter trong JavaScriptclass (hay lớp) được sử dụng để tạo ra các đối tượng (mà mình đã giới thiệu ở bài đối tượng trong JavaScript). 3.1. Phương thức getter 3.2. Phương thức setter 4. Phương thức tĩnh (Static method)ECMAScript 6 thì JavaSript hỗ trợ tạo ra class giống các ngôn ngữ lập trình hướng đối tượng khác (Java, PHP, Python...). 5. Hoisting đối với class
9. Class và prototypes Tổng kết Class có thể hiểu là một khuôn mẫu. Trong lập trình hướng đối tượng class (hay lớp) được sử dụng để tạo ra các đối tượng (mà mình đã giới thiệu ở bài đối tượng trong JavaScript).() { ... } Đối tượng thì sẽ có các thuộc tính, phương thức. phuongThuc1() { ... }() { ... } phuongThuc2() { ... }() { ... } phuongThuc3() { ... }() { ... } Các đối tượng giống nhau sẽ có những thuộc tính và phương thức giống nhau. Từ phiên bản ECMAScript 6 thì JavaSript hỗ trợ tạo ra class giống các ngôn ngữ lập trình hướng đối tượng khác (Java, PHP, Python...). Tham khảo: KHÓA HỌC JAVA KHÓA HỌC PHP: 'Ngô Minh Trung', KHÓA HỌC PYTHON: 'Nam', MSSV: 'B1704863',: 'B1704863', namSinh: '1999',: '1999', Có thể xem như việc sử dụng class và object sẽ giúp chúng ta có cái nhìn chuẩn hơn về code và để những bạn mới tiếp cận lập trình JavaSript cũng thấy gần gũi hơn. Cú pháp để tạo ra một class trong JavaSript:: function() { // Hàm khởi tạo.log('Đang học bài...'); constructor() { ... } diNgu: function() {: function() { // Các phương thức.log('Đang ngủ...'); constructor() { ... } xemPhim: function() {: function() { // Các phương thức.log('Đang xem phim...'); Các đối tượng giống nhau sẽ có những thuộc tính và phương thức giống nhau. Từ phiên bản ECMAScript 6 thì JavaSript hỗ trợ tạo ra class giống các ngôn ngữ lập trình hướng đối tượng khác (Java, PHP, Python...). Tham khảo: KHÓA HỌC JAVA KHÓA HỌC PHP KHÓA HỌC PYTHON Có thể xem như việc sử dụng class và object sẽ giúp chúng ta có cái nhìn chuẩn hơn về code và để những bạn mới tiếp cận lập trình JavaSript cũng thấy gần gũi hơn. Cú pháp để tạo ra một class trong JavaSript: // Hàm khởi tạoclass: constructor() { ... } class SinhVien { SinhVien { // Các phương thức }(hoTen, gioiTinh, MSSV, namSinh) { this.hoTen = hoTen;.hoTen = hoTen; this.gioiTinh = gioiTinh;.gioiTinh = gioiTinh; this.namSinh = namSinh;.namSinh = namSinh; } .MSSV = MSSV; Các đối tượng giống nhau sẽ có những thuộc tính và phương thức giống nhau. Từ phiên bản ECMAScript 6 thì JavaSript hỗ trợ tạo ra class giống các ngôn ngữ lập trình hướng đối tượng khác (Java, PHP, Python...). hocBai() {() { // Hàm khởi tạo.log('Đang học bài...'); Các đối tượng giống nhau sẽ có những thuộc tính và phương thức giống nhau. diNgu() {() { Từ phiên bản ECMAScript 6 thì JavaSript hỗ trợ tạo ra class giống các ngôn ngữ lập trình hướng đối tượng khác (Java, PHP, Python...)..log('Đang ngủ...'); Các đối tượng giống nhau sẽ có những thuộc tính và phương thức giống nhau. xemPhim() {() { // Các phương thức.log('Đang xem phim...'); Các đối tượng giống nhau sẽ có những thuộc tính và phương thức giống nhau. Từ phiên bản ECMAScript 6 thì JavaSript hỗ trợ tạo ra class giống các ngôn ngữ lập trình hướng đối tượng khác (Java, PHP, Python...). Tham khảo: KHÓA HỌC JAVA KHÓA HỌC PHP var sinhVien1 = new SinhVien(); sinhVien1 = new SinhVien(); var sinhVien2 = new SinhVien(); sinhVien2 = new SinhVien(); KHÓA HỌC PYTHON sinhVien3 = new SinhVien(); Có thể xem như việc sử dụng class và object sẽ giúp chúng ta có cái nhìn chuẩn hơn về code và để những bạn mới tiếp cận lập trình JavaSript cũng thấy gần gũi hơn.Lưu ý: Theo quy tắc thì bạn nên đặt tên class là viết HOA chữ cái đầu tiên như 2. Constructor là gì?Cú pháp để tạo ra một class trong JavaSript: (constructor hay là hàm khởi tạo) là một phương thức đặc biệt để tạo và khởi tạo một đối tượng từ một class nào đó. // Hàm khởi tạo constructor() { ... } constructor” trong một lớp. // Các phương thức } } }(hoTen, gioiTinh, MSSV, namSinh) { this.hoTen = hoTen;.hoTen = hoTen; this.gioiTinh = gioiTinh;.gioiTinh = gioiTinh; } .namSinh = namSinh; this.MSSV = MSSV;.MSSV = MSSV; Từ phiên bản ECMAScript 6 thì JavaSript hỗ trợ tạo ra class giống các ngôn ngữ lập trình hướng đối tượng khác (Java, PHP, Python...). Tham khảo:hàm constructor thì chỉ cần dùng từ khóa KHÓA HỌC JAVA KHÓA HỌC PHP constructor(a, b, c, d) {(a, b, c, d) { KHÓA HỌC PYTHON.hoTen = a; this.gioiTinh = b;.gioiTinh = b; this.namSinh = c;.namSinh = c; Có thể xem như việc sử dụng class và object sẽ giúp chúng ta có cái nhìn chuẩn hơn về code và để những bạn mới tiếp cận lập trình JavaSript cũng thấy gần gũi hơn..MSSV = d; Từ phiên bản ECMAScript 6 thì JavaSript hỗ trợ tạo ra class giống các ngôn ngữ lập trình hướng đối tượng khác (Java, PHP, Python...). Tham khảo: KHÓA HỌC JAVA sinhVien1 = new SinhVien(a, b, c, d); Tuy nhiên, để sau này dễ dàng biết thuộc tính nào kết nối với tham số nào thì chúng ta nên sử dụng tên tham số và đối số trong hàm constructor giống nhau.tên tham số và đối số trong hàm constructor giống nhau. constructor(hoTen, gioiTinh, MSSV, namSinh) {(hoTen, gioiTinh, MSSV, namSinh) { this.hoTen = hoTen;.hoTen = hoTen; this.gioiTinh = gioiTinh;.gioiTinh = gioiTinh; this.namSinh = namSinh; .namSinh = namSinh; this.MSSV = MSSV;.MSSV = MSSV; } > Ghi chú: Khi tạo class thì ta gọi là tham số. Khi khởi tạo và truyền dữ liệu thì ta gọi nó là đối sốGhi chú: Khi tạo class thì ta gọi là tham số. Khi khởi tạo và truyền dữ liệu thì ta gọi nó là đối số Chúng ta có nhiều cách gọi hàm như trong bài hàm mình có đề cập đến. Ví dụ như sau: // Khởi tạo các đối tượng sinh viên var sinhVien1 = new SinhVien("Ngô Minh Trung", "Nam", "B1704863", "1999"); sinhVien1 = new SinhVien("Ngô Minh Trung", "Nam", "B1704863", "1999"); var sinhVien2 = new SinhVien("Nguyễn Minh Đức", "Nam"); sinhVien2 = new SinhVien("Nguyễn Minh Đức", "Nam"); var sinhVien3 = new SinhVien(); sinhVien3 = new SinhVien(); // Log ra thông tin đối tượng console.log(sinhVien1);.log(sinhVien1); console.log(sinhVien2); .log(sinhVien2); console.log(sinhVien3); .log(sinhVien3); Kết quả ta được như sau:
> Lưu ý: Kể cả khi bạn không định nghĩa rõ ràng một constructor. JavaScript cũng sẽ tự động thêm vào một constructor rỗngLưu ý: Kể cả khi bạn không định nghĩa rõ ràng một constructor. JavaScript cũng sẽ tự động thêm vào một constructor rỗng 3. Phương thức getter và setter trong JavaScriptCác phương thức getter và setter được sử dụng để truy cập / sửa đổi thuộc tính trong class. Có thể hiểu là một loại hàm để lấy dữ liệu và một loại hàm dùng đế gán dữ liệu.lấy dữ liệu và một loại hàm dùng đế gán dữ liệu. 3.1. Phương thức getterCác phương thức getter được sử dụng để truy cập các thuộc tính của một đối tượng.phương thức getter được sử dụng để truy cập các thuộc tính của một đối tượng. Để tạo phương thức getter trong JavaScript, chúng ta sử dụng từ khóa Ví dụ: // Các phương thức getter get getHoTen() { getHoTen() { return this.hoTen; this.hoTen; } get getGioiTinh() { getGioiTinh() { return this.gioiTinh; this.gioiTinh; } return this.gioiTinh; getNamSinh() { return this.hoTen; this.hoTen; } get getMSSV() { getMSSV() { return this.MSSV; this.MSSV; } return this.gioiTinh; get getNamSinh() { Có bao nhiêu thuộc tính thì sẽ có bấy nhiêu hàm getter trong class. var sinhVien1 = new SinhVien("Ngô Minh Trung", "Nam", "B1704863", "1999"); sinhVien1 = new SinhVien("Ngô Minh Trung", "Nam", "B1704863", "1999"); var sinhVien2 = new SinhVien("Nguyễn Minh Đức", "Nam"); // Log ra thông tin đối tượng.log(sinhVien1.getGioiTinh); console.log(sinhVien2); console.log(sinhVien3); .log(sinhVien1.getGioiTinh()); Kết quả ta được như sau: > Lưu ý: Kể cả khi bạn không định nghĩa rõ ràng một constructor. JavaScript cũng sẽ tự động thêm vào một constructor rỗng 3. Phương thức getter và setter trong JavaScriptCác phương thức getter và setter được sử dụng để truy cập / sửa đổi thuộc tính trong class. cho phép bạn thay đổi giá trị của thuộc tính của đối tượng. Có thể hiểu là một loại hàm để lấy dữ liệu và một loại hàm dùng đế gán dữ liệu. Có bao nhiêu thuộc tính thì sẽ có bấy nhiêu hàm getter trong class. this.hoTen = hoTen;.hoTen = hoTen; } set setGioiTinh(gioiTinh) { setGioiTinh(gioiTinh) { return this.gioiTinh; .gioiTinh = gioiTinh; } set setNamSinh(namSinh) { setNamSinh(namSinh) { this.namSinh = namSinh;.namSinh = namSinh; } set setMSSV(MSSV) { setMSSV(MSSV) { this.MSSV = MSSV;.MSSV = MSSV; } return this.gioiTinh; get getNamSinh() { Có bao nhiêu thuộc tính thì sẽ có bấy nhiêu hàm getter trong class. sinhVien1 = new SinhVien("Ngô Minh Trung", "Nam", "B1704863", "1999"); Khi chúng ta sử dụng, chúng ta có thể truy cập giá trị như là một thuộc tính. Ví dụ:.setGioiTinh = "Nữ"; // Truy cập giới tính thông qua phương thức getter // Log ra thông tin đối tượng.log(sinhVien1.getGioiTinh); console.log(sinhVien2); console.log(sinhVien3); Lưu ý #1: JavaScript không hỗ trợ đầy đủ tính đóng gói trong Lập trình hướng đối tượng như Java, PHP hay Python. Vì thế, mọi thuộc tính đều có thể truy cập nếu bạn biết tên của thuộc tính đó (Giống như phạm vi truy cập public trong Java, tham khảo trong hướng dẫn: HỌC LẬP TRÌNH JAVA). Kết quả ta được như sau:Lưu ý #2: JavaScript nguyên bản thì không hỗ trợ private, protected nhưng bạn có thể mô phỏng chúng (Tuy nhiên sẽ hơi rắc rối đó) > Lưu ý: Kể cả khi bạn không định nghĩa rõ ràng một constructor. JavaScript cũng sẽ tự động thêm vào một constructor rỗng3. Phương thức getter và setter trong JavaScript Các phương thức getter và setter được sử dụng để truy cập / sửa đổi thuộc tính trong class.phương thức tĩnh được gọi mà không cần khởi tạo lớp của chúng và không thể được gọi thông qua một đối tượng của lớp. Có thể hiểu là một loại hàm để lấy dữ liệu và một loại hàm dùng đế gán dữ liệu. Có bao nhiêu thuộc tính thì sẽ có bấy nhiêu hàm getter trong class. constructor(x, y) {(x, y) { this.x = x;.x = x; Khi chúng ta sử dụng, chúng ta có thể truy cập giá trị như là một thuộc tính..y = y; Ví dụ: // Truy cập giới tính thông qua phương thức getter distance(a, b) { const dx = a.x - b.x; dx = a.x - b.x; const dy = a.y - b.y; dy = a.y - b.y; return Math.hypot(dx, dy); Math.hypot(dx, dy); Ví dụ: } return this.gioiTinh; p1 = new Point(5, 5); const p2 = new Point(10, 10); p2 = new Point(10, 10); p1.distance; //undefined.distance; //undefined p2.distance; //undefined.distance; //undefined console.log(Point.distance(p1, p2)); // 7.0710678118654755 .log(Point.distance(p1, p2)); // 7.0710678118654755 Chúng ta không thể gọi hàm distance thông qua 5. Hoisting đối với classKhông giống như các hàm và các khai báo JavaScript khác, các khai báo class (lớp) không được hoisting. var sinhVien1 = new SinhVien("Ngô Minh Trung"); sinhVien1 = new SinhVien("Ngô Minh Trung"); class SinhVien { SinhVien { constructor(name) {(name) { this.hoTen = hoTen;.hoTen = hoTen; } } Ví dụ trên sẽ tạo ra lỗi. Để tránh lỗi, bạn phải khai báo một lớp trước khi bạn có thể sử dụng nó, như vậy: constructor(name) {(name) { this.hoTen = hoTen; .hoTen = hoTen; } } Ví dụ trên sẽ tạo ra lỗi. sinhVien1 = new SinhVien("Ngô Minh Trung"); Để tránh lỗi, bạn phải khai báo một lớp trước khi bạn có thể sử dụng nó, như vậy:this.hoTen = hoTen; cũng hỗ trợ tính kế thừa (inheritance) như các ngôn ngữ khác, để tạo một lớp kế thừa, bạn sử dụng từ khóa } SinhVien extends ConNguoi {...} var sinhVien1 = new SinhVien("Ngô Minh Trung"); cho chúng ta khả năng sử dụng lại code đã viết. 6. Kế thừa class JavaScript cũng hỗ trợ tính kế thừa (inheritance) như các ngôn ngữ khác, để tạo một lớp kế thừa, bạn sử dụng từ khóa class SinhVien extends ConNguoi {...} constructor(hoTen, namSinh) {(hoTen, namSinh) { Kế thừa cho chúng ta khả năng sử dụng lại code đã viết..hoTen = hoTen || "unknown"; Sử dụng lại các thuộc tính và phương thức của một lớp có sẵn khi tạo một lớp mới giúp chúng ta tiết kiệm thời gian làm việc..namSinh = namSinh || "unknown"; } getHoTen() {() { } "Tên " + this.hoTen + ", sinh năm " + this.namSinh; } } class SinhVien extends ConNguoi { SinhVien extends ConNguoi { constructor(maSSV, hoTen, namSinh) {(maSSV, hoTen, namSinh) { super(hoTen, namSinh);(hoTen, namSinh); Ví dụ trên sẽ tạo ra lỗi..maSSV = maSSV || "unknown"; } getThongTin() {() { } this.getHoTen() + ", mã sinh viên " + this.maSSV; } } Ví dụ trên sẽ tạo ra lỗi. sinhVien1 = new SinhVien("B1704863", "Ngô Minh Trung", "1999"); Để tránh lỗi, bạn phải khai báo một lớp trước khi bạn có thể sử dụng nó, như vậy:.log(sinhVien1.getThongTin()); this.hoTen = hoTen; } var sinhVien1 = new SinhVien("Ngô Minh Trung");
class SinhVien extends ConNguoi {...} constructor(hoTen, namSinh) {(hoTen, namSinh) { Kế thừa cho chúng ta khả năng sử dụng lại code đã viết..hoTen = hoTen || "unknown"; Sử dụng lại các thuộc tính và phương thức của một lớp có sẵn khi tạo một lớp mới giúp chúng ta tiết kiệm thời gian làm việc..namSinh = namSinh || "unknown"; } getThongTin() {() { } "tên " + this.hoTen + ", sinh năm " + this.namSinh; } } class SinhVien extends ConNguoi { SinhVien extends ConNguoi { constructor(maSSV, hoTen, namSinh) {(maSSV, hoTen, namSinh) { super(hoTen, namSinh);(hoTen, namSinh); Ví dụ trên sẽ tạo ra lỗi..maSSV = maSSV || "unknown"; } } Ví dụ trên sẽ tạo ra lỗi.() { return ( ( "MSSV " + this.maSSV + ", " + super.getThongTin() + this.maSSV + ", " + super.getThongTin() Để tránh lỗi, bạn phải khai báo một lớp trước khi bạn có thể sử dụng nó, như vậy: } } Ví dụ trên sẽ tạo ra lỗi. sinhVien1 = new SinhVien("B1704863", "Ngô Minh Trung", "1999"); Để tránh lỗi, bạn phải khai báo một lớp trước khi bạn có thể sử dụng nó, như vậy:.log(sinhVien1.getThongTin()); this.hoTen = hoTen; } var sinhVien1 = new SinhVien("Ngô Minh Trung"); 6. Kế thừa classJavaScript cũng hỗ trợ tính kế thừa (inheritance) như các ngôn ngữ khác, để tạo một lớp kế thừa, bạn sử dụng từ khóa class SinhVien extends ConNguoi {...} thường được chỉ đến Object chứa phương thức đang được gọi thực thi. Kế thừa cho chúng ta khả năng sử dụng lại code đã viết. Sử dụng lại các thuộc tính và phương thức của một lớp có sẵn khi tạo một lớp mới giúp chúng ta tiết kiệm thời gian làm việc.(hoTen, namSinh) { Kế thừa cho chúng ta khả năng sử dụng lại code đã viết..hoTen = hoTen || "unknown"; Sử dụng lại các thuộc tính và phương thức của một lớp có sẵn khi tạo một lớp mới giúp chúng ta tiết kiệm thời gian làm việc..namSinh = namSinh || "unknown"; } getThongTin() {() { } "Tên " + this.hoTen + ", sinh năm " + this.namSinh; } } Ví dụ trên sẽ tạo ra lỗi. Để tránh lỗi, bạn phải khai báo một lớp trước khi bạn có thể sử dụng nó, như vậy: this.hoTen = hoTen;} còn có tác dụng xác định xem đối tượng có phải là một thể hiện (đối tượng) của một class hay không. Để mình ví dụ: constructor(hoTen, namSinh) {(hoTen, namSinh) { this.hoTen = hoTen || "unknown";.hoTen = hoTen || "unknown"; this.namSinh = namSinh || "unknown";.namSinh = namSinh || "unknown"; } getThongTin() {() { return "Tên " + this.hoTen + ", sinh năm " + this.namSinh; "Tên " + this.hoTen + ", sinh năm " + this.namSinh; } return "Tên " + this.hoTen + ", sinh năm " + this.namSinh; } sinhVien1 = new ConNguoi("Ngô Minh Trung", "1999"); var sinhVien2 = {}; sinhVien2 = {}; console.log(sinhVien1 instanceof ConNguoi); // true.log(sinhVien1 instanceof ConNguoi); // true var sinhVien1 = new ConNguoi("Ngô Minh Trung", "1999"); .log(sinhVien2 instanceof ConNguoi); // False console.log(sinhVien2 instanceof ConNguoi); // False Như vậy ta sẽ thấy Còn đối với constructor(hoTen, namSinh) {(hoTen, namSinh) { Ví dụ:.hoTen = hoTen || "unknown"; this.hoTen = hoTen || "unknown"; .namSinh = namSinh || "unknown"; } getHoTen() {() { return "Tên " + this.hoTen + ", sinh năm " + this.namSinh; "Tên " + this.hoTen + ", sinh năm " + this.namSinh; } return "Tên " + this.hoTen + ", sinh năm " + this.namSinh; } SinhVien extends ConNguoi { constructor(maSSV, hoTen, namSinh) {(maSSV, hoTen, namSinh) { super(hoTen, namSinh);(hoTen, namSinh); var sinhVien1 = new ConNguoi("Ngô Minh Trung", "1999"); .maSSV = maSSV || "unknown"; } getThongTin() {() { return "Tên " + this.hoTen + ", sinh năm " + this.namSinh; this.getHoTen() + ", mã sinh viên " + this.maSSV; } return "Tên " + this.hoTen + ", sinh năm " + this.namSinh; } sinhVien1 = new SinhVien("B1704863", "Ngô Minh Trung", "1999"); console.log(sinhVien1 instanceof SinhVien); // true.log(sinhVien1 instanceof SinhVien); // true var sinhVien1 = new ConNguoi("Ngô Minh Trung", "1999"); .log(sinhVien1 instanceof ConNguoi); // true console.log(sinhVien2 instanceof ConNguoi); // False Như vậy ta sẽ thấy hocBai1 là một thể hiện (đối tượng) của lớp MSSV5, thế nên câu lệnh này trả về giá trị hocBai3. Còn đối với Ví dụ: this.hoTen = hoTen || "unknown"; this.namSinh = namSinh || "unknown"; (hoTen, namSinh) { this.hoTen = hoTen || "unknown";.hoTen = hoTen || "unknown"; this.namSinh = namSinh || "unknown";.namSinh = namSinh || "unknown"; } getThongTin() {() { return "Tên " + this.hoTen + ", sinh năm " + this.namSinh; "Tên " + this.hoTen + ", sinh năm " + this.namSinh; } return "Tên " + this.hoTen + ", sinh năm " + this.namSinh; } sinhVien1 = new ConNguoi("Ngô Minh Trung", 1999); console.log(sinhVien1.getThongTin());.log(sinhVien1.getThongTin()); var sinhVien1 = new ConNguoi("Ngô Minh Trung", "1999"); .log(sinhVien1 instanceof ConNguoi); console.log(sinhVien2 instanceof ConNguoi); // False function ConNguoi(hoTen, namSinh) { ConNguoi(hoTen, namSinh) { this.hoTen = hoTen || "unknown";.hoTen = hoTen || "unknown"; this.namSinh = namSinh || "unknown";.namSinh = namSinh || "unknown"; return "Tên " + this.hoTen + ", sinh năm " + this.namSinh; ConNguoi.prototype.getThongTin = function() {.prototype.getThongTin = function() { } "Tên " + this.hoTen + ", năm sinh" + this.namSinh; return "Tên " + this.hoTen + ", sinh năm " + this.namSinh; } sinhVien1 = new ConNguoi("Ngô Minh Trung", 1999); console.log(sinhVien1.getThongTin());.log(sinhVien1.getThongTin()); var sinhVien1 = new ConNguoi("Ngô Minh Trung", "1999"); .log(sinhVien1 instanceof ConNguoi); console.log(sinhVien2 instanceof ConNguoi); // False Như vậy ta sẽ thấy Còn đối với hocBai4 là đối tượng trống, thì không phải là thể hiện của MSSV5 nên nó sẽ là hocBai6. Ví dụ: this.hoTen = hoTen || "unknown"; |