OOP ustunlari: extends orqali meros olish (Inheritance), super kalit so'zi qoidalari, Polymorphism (ko'p shakllilik), Method Overriding hamda JS da overloading cheklovlari.
Bu bobda OOP'ning yana ikkita muhim ustuni — Inheritance (Meros olish) va **Polymorphism (Ko'p shakllilik)**ni o'rganamiz.
Inheritance — bitta class boshqa class'ning barcha propertylari va metodlarini "meros olib", ustiga o'zining qo'shimcha xususiyatlarini qo'shishi.
Agar Dog, Cat, Bird — barchasi umumiy xususiyatlarga ega bo'lsa (masalan, name, eat()), bu umumiy qismlarni har bir class'da alohida-alohida qayta yozish o'rniga, ularni umumiy Animal class'ida yozib, qolganlar undan meros olishlari mumkin.
🧬 Inheritance — bu biologik meros: bola ota-onasining ko'plab xususiyatlarini (ko'z rangi, bo'yi) meros oladi, lekin o'zining alohida xususiyatlariga (masalan, ismiga) ham ega bo'ladi.
script.jsJavaScriptclass Animal {constructor(name) {this.name = name;}eat() {console.log(`${this.name} ovqatlanmoqda`);}}class Dog extends Animal {bark() {console.log(`${this.name} vovullamoqda`);}}let myDog = new Dog("Ola");myDog.eat(); // "Ola ovqatlanmoqda" — Animal'dan merosmyDog.bark(); // "Ola vovullamoqda" — Dog'ning o'zida
extends Animal — Dog class'i Animaldan meros olishini bildiradi.myDog) — Animalning barcha metodlariga (eat()) kirisha oladi, xuddi o'zida yozilgandek.bark()) ham ega.🔗 Connection
extends — Chapter 21'da o'rgangan Prototype Chain mexanizmini ishlatadi: Dog.prototypening prototipi — Animal.prototype qilib avtomatik belgilanadi.
super — bola class ichida ota-klassning constructor'i yoki metodlariga murojaat qilish uchun ishlatiladi.
script.jsJavaScriptclass Animal {constructor(name) {this.name = name;}describe() {return `Men — ${this.name}`;}}class Dog extends Animal {constructor(name, breed) {super(name); // Animal'ning constructor'ini chaqiradithis.breed = breed;}describe() {return super.describe() + `, zoti — ${this.breed}`;}}let dog = new Dog("Ola", "Labrador");console.log(dog.describe()); // "Men — Ola, zoti — Labrador"
new Dog("Ola", "Labrador") chaqiriladi.super(name) chaqiradi.super(name) — Animalning constructor'ini chaqiradi, u this.name = nameni bajaradi.this.breed = breedni bajaradi.describe() chaqirilganda, super.describe() — Animalning describe() metodini chaqiradi, natijaga qo'shimcha matn qo'shiladi.⚠️ Common Mistake
Agar bola class'da constructor yozilgan bo'lsa, unda super(...)ni chaqirish majburiy — aks holda xatolik chiqadi:
script.jsJavaScriptclass Dog extends Animal {constructor(name, breed) {this.breed = breed; // ❌ ReferenceError: 'this' o'zi hali "yaratilmagan"}}
Nima uchun? super() chaqirilmaguncha, this hali mavjud emas — chunki ota-klass constructor'i thisni "yaratish" uchun javobgar.
Polymorphism — turli class'lar bir xil nomdagi metodga ega bo'lishi, lekin har biri o'zicha boshqacha ishlashi.
Chunki bu — "abstrakt" tushuncha, uni amaliy misolsiz tasavvur qilish qiyin. Aslida siz buni Chapter 23.2'da describe() metodi orqali allaqachon ko'rgan edingiz — Dog o'zining describe()sini Animalnikidan farqli qilib yozdi (bu — method overriding deb ataladi).
🔊 Polymorphism'ni turli hayvonlarning "ovoz chiqarish" qobiliyatiga o'xshating: hammasi "ovoz chiqaradi" (bir xil metod nomi), lekin it vovullaydi, mushuk miyovlaydi, qush sayraydi (har biri o'zicha ishlaydi).
script.jsJavaScriptclass Animal {makeSound() {console.log("Хайвон ovoz chiqarmoqda");}}class Dog extends Animal {makeSound() {console.log("Vov-vov!");}}class Cat extends Animal {makeSound() {console.log("Myov!");}}class Bird extends Animal {makeSound() {console.log("Chirq-chirq!");}}let animals = [new Dog(), new Cat(), new Bird()];animals.forEach(animal => animal.makeSound());// "Vov-vov!"// "Myov!"// "Chirq-chirq!"
Eng muhim jihati: animals.forEach(animal => animal.makeSound()) qatorida, biz har bir hayvon turini alohida tekshirmadik (if (animal instanceof Dog) ... kabi). Kod shunchaki har bir object'ga makeSound()ni chaqirdi, va JavaScript avtomatik ravishda har biri uchun to'g'ri (o'ziga xos) versiyani tanladi.
code.textTEXTanimals array: [Dog, Cat, Bird]│▼ forEach(animal => animal.makeSound())│Har bir object o'zining METHOD OVERRIDEqilingan makeSound() versiyasini ishlatadi
💡 Key Idea
Polymorphism orqali kod umumiyroq va kengaytiriladigan bo'ladi: agar ertaga yangi Fish class qo'shilsa (makeSound() bilan), yuqoridagi forEach kodini o'zgartirish shart emas — u avtomatik ishlayveradi.
⚠️ Common Mistake
JavaScript'da bir xil nomli metodni ikki marta yozishga urinish — ikkinchisi birinchisini butunlay almashtiradi (overload emas):
script.jsJavaScriptclass Test {method(a) { console.log("1 argument"); }method(a, b) { console.log("2 argument"); } // birinchisini "yopib qo'yadi"}
Agar "overloading"ga o'xshash xatti-harakat kerak bo'lsa, argumentlar sonini metod ichida tekshirish kerak:
script.jsJavaScriptclass Test {method(a, b) {if (b === undefined) {console.log("1 argument bilan ishladi");} else {console.log("2 argument bilan ishladi");}}}
Task:
Shape class yarating (name bilan), undan meros oluvchi Square class yarating (side bilan). Squarega area() metodini qo'shing.
Required Concepts:
extends, supersuper(name)ni constructor ichida chaqirishni unutmang.Task:
Employee class yarating (name, salary), getDetails() metodi bilan. Manager class'ini Employeedan meros qildirib, getDetails()ni override qiling — u ota-klassning natijasiga " (Menejer)" qo'shsin (super.getDetails()dan foydalaning).
Required Concepts:
superreturn super.getDetails() + " (Menejer)";Task:
Shape (abstrakt g'oyaviy ota-klass, area() metodi 0 qaytarsin) dan meros oluvchi Circle va Rectangle class'larini yarating, ikkalasida ham area()ni o'zicha override qiling. Bir nechta shakl'dan iborat array yarating va forEach bilan har birining maydonini polymorphism orqali chiqaring.
Required Concepts:
script.jsJavaScriptclass A {greet() {console.log("A dan salom");}}class B extends A {greet() {super.greet();console.log("B dan salom");}}new B().greet();
🧠 Think first! Javobni ko'rishdan oldin kamida 30 soniya o'ylang.
<details> <summary>Answer</summary> A dan salom B dan salomWhy?
Bning greet() metodi avval super.greet() orqali Aning greet()ini chaqiradi ("A dan salom" chiqadi), keyin o'zining qo'shimcha kodini bajaradi ("B dan salom" chiqadi).
Quyidagi kodda muammo bor:
script.jsJavaScriptclass Vehicle {constructor(brand) {this.brand = brand;}}class Car extends Vehicle {constructor(brand, model) {this.model = model;super(brand);}}let car = new Car("Toyota", "Corolla");
Your Task:
Yechim: super() har doim constructor ichida birinchi qatorda chaqirilishi kerak:
</details>script.jsJavaScriptclass Car extends Vehicle {constructor(brand, model) {super(brand);this.model = model;}}let car = new Car("Toyota", "Corolla");
extends) — bir class boshqasining xususiyatlarini meros oladi.super() — ota-klass constructor'ini chaqirish uchun, bola constructor'ida majburiy va birinchi bo'lishi kerak.super.methodName() — ota-klassning metodini chaqirish uchun.super() bola constructor'ida thisdan foydalanishdan oldin chaqirilishi shart.extends — Prototype Chain mexanizmini "sahna orqasida" ishlatadi.script.jsJavaScriptclass Animal {constructor(name) {this.name = name;}speak() {console.log(`${this.name} ovoz chiqaradi`);}}class Dog extends Animal {constructor(name) {super(name); // majburiy, birinchi qatorda}speak() {super.speak(); // ota-klass metodini chaqirishconsole.log(`${this.name} vovullaydi`);}}
Mavzu bo‘yicha tushunchalaringizni interaktiv test orqali sinovdan o‘tkazing va natijalarni bilib oling.
Darslikda o‘rganilgan qoidalarga asosan real kod yozing, testlardan o‘tkazing va yechimlarni mustahkamlang.
Test Sinovi
Hali topshirilmagan (kamida 75% kerak)
Amaliy Masalalar
0 / 3 ta yechildi (kamida 75% kerak)
Dars sifati va mazmunini yaxshilash uchun o‘z haqqoniy bahoingizni qoldiring.
Mavzuni to‘liq o‘zlashtirish uchun test sinovi, amaliy kodlash va bog‘liq darslar
O‘z bilimingizni interaktiv test savollari orqali tekshiring va darhol xatolarni tahlil qiling.
Nazariyani real kod yozish bilan mustahkamlang, avtomatik testlardan o‘ting va XP to‘plang.
Kurs bo‘yicha keyingi va bog‘liq mavzular: