Factory Functions và Constructor Functions trong JavaScript
Tạo từng đối tượng một là một sai lầm.
Nếu bạn viết thủ công một đối tượng cho mỗi người dùng hoặc bạn cùng lớp, bạn đang lặp lại mã nguồn. Nếu bạn có 100 người dùng, bạn sẽ phải viết cùng một logic 100 lần. Điều này dẫn đến lỗi (bugs). Bạn có thể vô tình thay đổi một thuộc tính sau đó và làm hỏng ứng dụng của mình.
Thay vào đó, hãy sử dụng hai mẫu (pattern) này để viết mã sạch hơn.
- Factory Functions
Hãy nghĩ về một nhà máy thực sự. Nguyên liệu thô được đưa vào. Một sản phẩm hoàn chỉnh được đưa ra.
Một factory function nhận các tham số và trả về một đối tượng mới.
Ví dụ:
function classFactory(name) {
return {
reply() {
return `${name} is present`
}
}
}
Lợi ích:
- Bạn chỉ cần viết logic một lần.
- Bạn tái sử dụng hàm cho mọi đối tượng mới.
- Dữ liệu được bảo vệ an toàn. Biến
namenằm bên trong phạm vi (scope) của hàm. Bạn không thể vô tình ghi đè nó từ bên ngoài.
- Constructor Functions
Constructor functions cũng dùng để tạo đối tượng. Chúng sử dụng từ khóa new và từ khóa this. Theo quy ước, bạn bắt đầu tên của chúng bằng một chữ cái viết hoa.
Ví dụ:
function Classmate(name) {
this.name = name
this.reply = function() {
return `${this.name} is present`
}
}
Khi bạn sử dụng new, JavaScript sẽ thực hiện công việc đó cho bạn:
- Nó tạo ra một đối tượng mới.
- Nó gán đối tượng đó cho
this. - Nó tự động trả về đối tượng đó.
Bạn không cần câu lệnh return.
Mở rộng mã nguồn của bạn
Bạn có thể kết hợp các mẫu này với mảng (arrays) để xử lý lượng dữ liệu lớn. Thay vì nhập từng cái tên, hãy sử dụng hàm map.
Ví dụ:
const names = ['Kali', 'Andrew', 'Pearl', 'Percy']
const classmates = names.map(name => new Classmate(name))
Bây giờ bạn đã có một danh sách các đối tượng sẵn sàng để sử dụng.
Tóm tắt:
- Tránh tạo đối tượng thủ công để ngăn chặn việc lặp lại mã.
- Sử dụng Factory Functions để đóng gói logic và bảo vệ dữ liệu.
- Sử dụng Constructor Functions để tận dụng từ khóa
newnhằm tạo đối tượng tự động. - Luôn viết logic một lần và tái sử dụng ở mọi nơi.
Nguồn: https://dev.to/pearlodi/factory-functions-and-constructor-functions-in-javascript-lmb