Constructor funksiyalar
Muammodan boshlaylik
Foydalanuvchi ro'yxatini yaratishingiz kerak. Har bir foydalanuvchi: ism, email, rol.
const foydalanuvchi1 = { ism: "Jasur", email: "jasur@mail.com", rol: "user" };
const foydalanuvchi2 = { ism: "Malika", email: "malika@mail.com", rol: "admin" };
const foydalanuvchi3 = { ism: "Sardor", email: "sardor@mail.com", rol: "user" };
100 ta foydalanuvchi bo'lsa — 100 ta ob'ekt literal yoziladi. Har birida bir xil tuzilma. Xususiyat nomini xato yozsangiz — bitta ob'ektda boshqacha bo'lib qoladi.
Constructor funksiya — bir xil tuzilmadagi ob'ektlarni "qolipdan" yaratadi.
Constructor funksiya nima?
Constructor funksiya — oddiy funksiya, lekin new kalit so'zi bilan chaqiriladi va yangi ob'ekt qaytaradi.
Hayotiy o'xshatma
G'isht qolip. Bir qolipdan yuzlab bir xil shakldagi g'ishtlar yasaladi. Qolip o'zgarmaydi, har safar yangi g'isht chiqadi. Constructor — o'sha qolip.
function Foydalanuvchi(ism, email, rol) {
this.ism = ism;
this.email = email;
this.rol = rol;
}
const jasur = new Foydalanuvchi("Jasur", "jasur@mail.com", "user");
const malika = new Foydalanuvchi("Malika", "malika@mail.com", "admin");
console.log(jasur.ism); // "Jasur"
console.log(malika.rol); // "admin"
Convention: constructor funksiya nomi Katta harf bilan boshlanadi — bu kod o'quvchiga signal: "bu new bilan chaqiriladi".
new nima qiladi?
new Foydalanuvchi(...) chaqirilganda JavaScript to'rtta ishni bajaradi:
1. Bo'sh ob'ekt yaratadi: {}
2. this ni o'sha ob'ektga yo'naltiradi
3. Funksiya ichidagi kod ishlaydi (this.ism = ism, va h.k.)
4. Ob'ektni qaytaradi
Vizual:
function Foydalanuvchi(ism) {
// 1. this = {} (bo'sh ob'ekt — new tomonidan yaratildi)
this.ism = ism; // 2. ob'ektga xususiyat qo'shildi
// 3. return this; — new avtomatik qaytaradi
}
Agar new ishlatilmasa — this global ob'ektga (yoki undefined ga strict modeda) yo'naladi:
const xato = Foydalanuvchi("Jasur"); // new yo'q!
console.log(xato); // undefined — funksiya hech narsa qaytarmadi
console.log(window.ism); // "Jasur" — global ga yozildi! ❌
Metodlar qo'shish — prototype orqali
Har bir ob'ektga alohida metod qo'shish — xotira isrof:
function Foydalanuvchi(ism) {
this.ism = ism;
this.salomlash = function() { // ❌ — har ob'ektda alohida nusxa
console.log(`Salom, ${this.ism}`);
};
}
const a = new Foydalanuvchi("Ali");
const b = new Foydalanuvchi("Vali");
console.log(a.salomlash === b.salomlash); // false — ikki alohida funksiya
To'g'ri usul — metodlarni prototype ga qo'shish:
function Foydalanuvchi(ism, email) {
this.ism = ism; // ← ob'ektning o'zida (har birida boshqa qiymat)
this.email = email;
}
Foydalanuvchi.prototype.salomlash = function() { // ← bir marta, hammada umumiy
console.log(`Salom, ${this.ism}!`);
};
Foydalanuvchi.prototype.info = function() {
console.log(`${this.ism} — ${this.email}`);
};
const a = new Foydalanuvchi("Ali", "ali@mail.com");
const b = new Foydalanuvchi("Vali", "vali@mail.com");
a.salomlash(); // "Salom, Ali!"
b.salomlash(); // "Salom, Vali!"
console.log(a.salomlash === b.salomlash); // true ← bir xil funksiya, xotira tejaldi
Nima uchun prototype? Metod a va b da bir xil ishlaydi — ikkitasi uchun alohida nusxa saqlash shart emas. Prototype da bir marta saqlansa — ikkalasi ham foydalanadi.
instanceof — kimdan yaratilgan?
function Foydalanuvchi(ism) { this.ism = ism; }
function Mahsulot(nomi) { this.nomi = nomi; }
const jasur = new Foydalanuvchi("Jasur");
const noutbuk = new Mahsulot("Noutbuk");
console.log(jasur instanceof Foydalanuvchi); // true
console.log(jasur instanceof Mahsulot); // false
console.log(noutbuk instanceof Mahsulot); // true
Tez-tez uchraydigan xatolar
new unutish:
function Foydalanuvchi(ism) {
this.ism = ism;
}
const f = Foydalanuvchi("Jasur"); // ← new yo'q!
console.log(f); // undefined
console.log(f.ism); // ❌ TypeError
Bu xatoning oldini olish — new.target bilan:
function Foydalanuvchi(ism) {
if (!new.target) {
throw new Error("new bilan chaqiring: new Foydalanuvchi()");
}
this.ism = ism;
}
Konstruktorda metod yozish — xotira isrof:
// ❌ — har yangi ob'ektda alohida funksiya nusxasi yaratiladi
function Foydalanuvchi(ism) {
this.ism = ism;
this.salomlash = function() { console.log(this.ism); };
}
// ✅ — bir marta prototype da
function Foydalanuvchi(ism) {
this.ism = ism;
}
Foydalanuvchi.prototype.salomlash = function() { console.log(this.ism); };
Xulosa
Constructor funksiya — bir xil tuzilmadagi ob'ektlarni qolipdan yaratadi.
new to'rtta ish qiladi: bo'sh ob'ekt yaratadi → this ni yo'naltiradi → kod ishlaydi → ob'ektni qaytaradi.
Metodlar — prototype ga qo'shiladi, ob'ektning o'ziga emas. Xotira tejash uchun.
Amalda esa — class sintaksisi ishlatiladi (keyingi dars). U constructor + prototype ni qulay yozuvga o'radi.
Keyingi dars
29-dars: Class — asoslar, constructor, maydonlar