Constructor trong JavaScript

Ngày đăng: 06/04/2021   -    Cập nhật: 06/04/2021
Trong hướng dẫn này, mình sẽ giúp bạn tìm hiểu về Constructor trong JavaScript và cách sử dụng từ khóa new để tạo một đối tượng. (Và cả cách không sử dụng từ khóa new)


1. Giới thiệu về hàm Constructor trong JavaScript



Constructor trong JavaScript


Trong hướng dẫn về các Object trong JavaScript, bạn đã học cách sử dụng cú pháp (theo nghĩa đen) của đối tượng để tạo một đối tượng mới:



// Tạo một đối tượng
let student = {
    name: 'Ngọc Anh',
    age: 18
}
 


Trong thực tế, bạn thường cần tạo nhiều đối tượng giống nhau như một danh sách sinh viên.


Để làm điều này, bạn có thể sử dụng một hàm constructor (hàm khởi tạo) để xác định một kiểu tùy chỉnh và toán tử mới để tạo nhiều đối tượng từ kiểu này.


Về mặt kỹ thuật, một hàm constructor trong JavaScript là một hàm thông thường với quy ước sau:



  • Tên của một hàm khởi tạo bắt đầu bằng một chữ cái viết HOA như Student, Document, v.v.
  • Một hàm khởi tạo chỉ nên được gọi với toán tử new.


> Lưu ý: Phiển bản ES6 của JavaScript giới thiệu từ khóa class cho phép bạn định nghĩa một kiểu tùy chỉnh. Tuy nhiên, class cũng chỉ là cú pháp trên các hàm khởi tạo với một số cải tiến.


Ví dụ sau định nghĩa một hàm khởi tạo được gọi là Student:




// Hàm constructor
function Student(nameage) {
    this.name = name;
    this.age = age;
}
 


Như bạn có thể thấy, Student giống như một hàm thông thường ngoại trừ tên của nó bắt đầu bằng chữ S viết hoa.


Để tạo một phiên bản mới của Student, bạn sử dụng toán tử new:




let student = new Student('Ngọc Anh'18);
 


Về cơ bản, nhà điều hành mới thực hiện những việc sau:


  • Tạo một đối tượng trống mới và gán nó cho this.
  • Gán các đối số 'Ngọc Anh'18 cho các thuộc tính nameage
  • Trả lại giá trị this.


Nó tương đương về mặt chức năng như sau:



// Hàm constructor
function Student(nameage) {

    // this = {};

    // Thêm thuộc tính cho this
    this.name = name;
    this.age = age;

    // return this;
}
 


Và câu lệnh này:



// Tạo một đối tượng mới từ Student
// và gán giá trị khởi tạo cho nó
let student = new Student('Ngọc Anh'18);
 


Thì tương đương với:



let student = {
    name: 'Ngọc Anh',
    age: 18
}
 


Tuy nhiên, hàm hàm constructor Student này cho phép bạn tạo nhiều đối tượng giống nhau. Ví dụ:



// Tạo mới đối tượng 1
let student1 = new Student('Ngọc Anh'18);
// Tạo mới đối tượng 2
let student2 = new Student('Vũ Hà'20);
 


> Tham khảo: Constructor trong Java


2. Thêm phương thức vào hàm constructor trong JavaScript



Một đối tượng có thể có các phương thức thao tác với dữ liệu của nó. Để thêm một phương thức vào một đối tượng được tạo thông qua constructor, bạn có thể sử dụng từ khóa this. Ví dụ:



// Hàm constructor
function Student(nameage) {

    // Thêm thuộc tính cho this
    this.name = name;
    this.age = age;

    // Thêm phương thức
    this.getInfor = function () {
        return this.name + " " + this.age + " tuổi";
    };
}
 


Bây giờ, bạn có thể tạo một đối tượng mới từ Student và gọi phương thức getInfor():



let student = new Student('Ngọc Anh'18);
console.log(student.getInfor());
 


Kết quả:



Ngọc Anh 18 tuổi
 


Vấn đề ở đây là khi bạn tạo nhiều đối tượng từ Student, this.getInfor() sẽ bị lặp lại nhiều lần.


Do đó, đây không phải là cách quản lý bộ nhớ hiệu quả.


Để giải quyết vấn đề này, bạn có thể sử dụng Prototype để tất cả các đối tượng của một kiểu tùy chỉnh có thể chia sẻ cùng một phương thức.


return từ hàm Constructor



Thông thường, một hàm constructor được return ngầm định giá trị this được thiết lập cho đối tượng mới được tạo.


Nhưng nếu nó có câu lệnh trả về, thì đây là quy tắc của nó:



  • Nếu return được gọi với một đối tượng, hàm constructor sẽ trả về đối tượng đó thay vì đối tượng this.
  • Nếu return được gọi với một giá trị khác với một đối tượng, nó sẽ bị bỏ qua.

3. Gọi constructor mà không có từ khóa new



Có thể gọi một hàm tạo mà không có từ khóa new như sau:



let student = Student('Ngọc Anh'18);
 


Trong trường hợp này, Student chỉ thực thi giống như một hàm thông thường. Do đó, hàm this bên trong hàm Student không liên kết với biến student mà là đối tượng toàn cục.


Nếu bạn cố gắng truy cập thuộc tính name hoặc age, bạn sẽ gặp lỗi:




console.log(student.name);
 


Kết quả:



error: Cannot read property 'name' of undefined
 


Tương tự, bạn không thể truy cập phương thức getInfor() vì nó bị ràng buộc với đối tượng toàn cục.



student.getInfor();
 


Lỗi:



error: Cannot read property 'getInfor' of undefined
 


Vì thế, để ngăn một hàm constructor được gọi mà không có từ khóa new, ES6 đã giới thiệu thuộc tính new.target.


Nếu một hàm constructor được gọi với từ khóa new, new.target trả về một tham chiếu đến hàm. Nếu không, nó trả về undefined.


Hãy hiển thị giá trị của new.target cho console bên trong hàm Student:




// Hàm constructor
function Student(nameage) {

    console.log(new.target);

    // Thêm thuộc tính cho this
    this.name = name;
    this.age = age;

    // Thêm phương thức
    this.getInfor = function () {
        return this.name + " " + this.age + " tuổi";
    };
}
 


Bây giờ, chúng ta lại thử tạo một đối tượng mới từ Student nhưng không sử dụng từ khóa new.



let student = Student('Ngọc Anh'18);
 


Kết quả nhận được trong console:



undefined
 


Tuy nhiên, nếu sử dụng new thì nó trả về một tham chiếu đến hàm Student:



let student = new Student('Ngọc Anh'18);
 


Trong console:



function Student....
 


Và bằng cách tận dụng new.target, bạn có thể buộc người dùng sử dụng constructor phải gọi nó bằng từ khóa new.


Nếu không, hãy ném ra một lỗi:




// Hàm constructor
function Student(nameage) {

    if (!new.target) {
        throw Error("Không thể gọi mà thiếu 'new'");
    }

    // Thêm thuộc tính cho this
    this.name = name;
    this.age = age;

    // Thêm phương thức
    this.getInfor = function () {
        return this.name + " " + this.age + " tuổi";
    };
}
 


Ngoài ra, bạn có thể làm cho cú pháp linh hoạt hơn bằng cách tự tạo một đối tượng Student mới nếu người dùng không sử dụng từ khóa new:



// Hàm constructor
function Student(nameage) {

    if (!new.target) {
        return new Student(nameage);
    }

    // Thêm thuộc tính cho this
    this.name = name;
    this.age = age;

    // Thêm phương thức
    this.getInfor = function () {
        return this.name + " " + this.age + " tuổi";
    };
}

// Tạo đối tượng mà không có từ khóa new
let student = Student('Ngọc Anh'18);

// Lấy thông tin
console.log(student.getInfor());


Kết quả:



Ngọc Anh 18 tuổi
 


 

Cách này thường được sử dụng trong các thư viện hoặc framework bạn sẽ thường gặp nếu như học React / Angular / Vue bởi vì nó làm cho cú pháp linh hoạt hơn.

 

Tổng kết



Như vậy là trong bài viết này mình đã giúp bạn tìm hiểu về hàm Constructor trong JavaScript và biết cách sử dụng nó để tạo ra nhiều đối tượng khác nhau.


Hi vọng giúp được bạn trong quá trình học JavaScript của bạn.


> Nếu bạn yêu thích JS và muốn đi chuyên sâu về nó thì đừng quên tham gia KHÓA HỌC FRONT END (với React.js) tại NIIT - ICT Hà Nội nhé. Học với dự án + Cam kết hỗ trợ giới thiệu việc làm / địa chỉ thực tập.


---

HỌC VIỆN ĐÀO TẠO CNTT NIIT - ICT HÀ NỘI
Học Lập trình chất lượng cao (Since 2002). Học thực tế + Tuyển dụng ngay!
Đc: Tầng 3, 25T2, N05, Nguyễn Thị Thập, Cầu Giấy, Hà Nội
SĐT: 02435574074 - 0383.180086
Email: hello@niithanoi.edu.vn
Fanpage: https://facebook.com/NIIT.ICT/
 
#niit #icthanoi #niithanoi #niiticthanoi #hoclaptrinh #khoahoclaptrinh #hoclaptrinhjava #hoclaptrinhphp #java #php #python
Bình luận Facebook
Khóa học liên quan đến bài viết

KHÓA HỌC LẬP TRÌNH FRONT END VỚI REACT.JS

56 giờ
Học Lập trình Front end hiện đại với ReactJS. Học làm chủ HTML, CSS, JS và thư viện JavaScript phổ biến nhất hiện nay. Sẵn sàng đi thực tập / đi làm ngay sau khóa học.

Khóa học PHP Full stack [2023] cho người mới bắt đầu

96 giờ
Khóa học Lập trình PHP Full stack, phiên bản cập nhật lần thứ 8. Dạy Lập trình PHP bài bản từ Front end đến Back end + Laravel. Hướng dẫn làm 2 Dự Án Web lớn

Khóa học Java Full stack (IJFD)

104 giờ
Học lập trình Java Fullstack với khóa học được xây dựng theo lộ trình bài bản, từ JAVA CƠ BẢN đến JAVA WEB và nâng cao về JAVA FRAMEWORK như: Spring Boot, Hibernate
Mục lục
Đăng ký tư vấn
Nhân viên gọi điện tư vấn miễn phí sau khi đăng ký
Được cập nhật các ưu đãi sớm nhất
Hotline: 0383180086
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Hãy đăng ký để nhận những thông tin mới nhất về học bổng mới nhất tại NIIT - ICT Hà Nội
top
Đóng lại Đăng ký học tại NIIT - ICT Hà Nội
6260+ học viên đã theo học tại NIIT - ICT Hà Nội và có việc làm tốt trong ngành lập trình. Nắm lấy cơ hội ngay hôm nay!
Chọn khóa học
  • KHÓA HỌC LẬP TRÌNH FRONT END VỚI REACT.JS
  • KHÓA HỌC LẬP TRÌNH PHP WEB
  • Khóa học PHP Full stack [2023] cho người mới bắt đầu
  • Khóa học BIG DATA với Hadoop và Spark
  • Khóa học Lập trình Android tại Hà Nội
  • [Tuyển sinh 2023] Lập trình viên Quốc tế DigiNxt
  • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại Hà Nội
  • LẬP TRÌNH GAME
    • Khóa học Lập trình Game Unity
  • LẬP TRÌNH WEB FRONT END
    • KHÓA HỌC PYTHON HƯỚNG ĐỐI TƯỢNG
    • KHÓA HỌC ANGULAR & TYPESCRIPT (FRONT END)
  • LẬP TRÌNH WEB BACK END
    • LẬP TRÌNH JAVA WEB VỚI FRAME WORK
    • Lập trình Web với Django
    • Lập trình PHP với Laravel Framework
  • CHƯƠNG TRÌNH ĐÀO TẠO ỨNG DỤNG CÔNG NGHỆ
    • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại TP HCM
  • LẬP TRÌNH WEB FULL STACK
    • Khóa học Java Full stack (IJFD)
  • LẬP TRÌNH MOBILE
    • FRONT-END VỚI REACTJS VÀ REACT NATIVE
    • Lập trình Android Nâng cao
  • ĐÀO TẠO CHO DOANH NGHIỆP
    • KHÓA HỌC BUSINESS ANALYSIC TỪ CƠ BẢN ĐẾN NÂNG CAO 2023
    • Khóa học Magento: Làm chủ CMS TMĐT lớn nhất
    • Khóa học IOT: Xây dựng Sản phẩm IOT với Raspberry Pi
    • Khóa học Automation Testing Chuyên nghiệp
  • KHÓA HỌC DỰ ÁN
    • Học sử dụng bộ Office: Word, Excel, Power Point, Mail chuyên nghiệp
  • KHÓA HỌC KHÁC
    • VBA Excel Toàn Tập (Cơ Bản - Nâng Cao)
    • VBA Excel Nâng cao
    • Khóa học JMeter: Performance Testing
    • Khóa học Tester đạt chuẩn Quốc tế ISTQB Foundation Level
    • Khoá Học Tester đạt chuẩn quốc tế ISTQB Advanced Level
Bạn chưa chọn khóa học cần đăng ký
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Đăng ký học thành công!
Cảm ơn bạn đã đăng ký học tại NIIT - ICT HÀ NỘI!