JavaScript'da prototiplar mexanizmi, Prototype Chain (merosxo'rlik zanjiri), __proto__ vs prototype farqi, Constructor funksiyalar va hasOwnProperty metodi.
Bu — JavaScript'ning eng o'ziga xos va ko'pchilik boshqa tillardan (Java, C#) kelgan dasturchilarni chalg'itadigan mavzusi. JavaScript'da klassik OOP tillaridagidek "class" tushunchasi asl holida mavjud emas — uning o'rniga Prototype mexanizmi ishlaydi.
Har bir JavaScript object'i boshqa bir object'ga — o'zining prototipiga — "bog'langan" bo'ladi. Agar object'da biror property yoki metod topilmasa, JavaScript uni avtomatik ravishda prototipdan qidiradi.
Agar 1000 ta object yaratilsa va har biri bir xil metodga ega bo'lishi kerak bo'lsa, har bir object'ga alohida-alohida metod nusxasini yozish — xotirani behuda sarflaydi. Prototype orqali metod bitta joyda saqlanadi va barcha object'lar uni "bo'lishadi" (share qiladi).
🧬 Prototype'ni oilaviy meros deb tasavvur qiling: agar sizda biror narsa (masalan, familiya) bo'lmasa, siz uni ota-onangizdan (prototipdan) "meros olasiz". Agar ota-onada ham bo'lmasa, bobo-buvidan qidiriladi — va hokazo, toki topilmaguncha.
script.jsJavaScriptlet animal = {eats: true};let rabbit = Object.create(animal);rabbit.jumps = true;console.log(rabbit.jumps); // true (o'zida bor)console.log(rabbit.eats); // true (prototipdan meros olingan)
rabbitning o'zida eats propertysi yo'q, lekin Object.create(animal) orqali uning prototipi animal qilib belgilangan, shuning uchun rabbit.eats so'ralganda, JavaScript uni animaldan topib beradi.
Agar property bir necha darajali prototiplar orqali qidirilishi kerak bo'lsa, bu jarayon Prototype Chain deb ataladi — bu, aslida, Chapter 11'da o'rgangan Scope Chain'ga juda o'xshash tushuncha, faqat variable'lar emas, object propertylari uchun.
script.jsJavaScriptlet grandparent = { canWalk: true };let parent = Object.create(grandparent);parent.canTalk = true;let child = Object.create(parent);child.canCode = true;console.log(child.canCode); // true (o'zida bor)console.log(child.canTalk); // true (parent'dan)console.log(child.canWalk); // true (grandparent'dan)
code.textTEXTchild → canCode: true│ (prototype)parent → canTalk: true│ (prototype)grandparent → canWalk: true│ (prototype)null (zanjir shu yerda tugaydi)
child.canWalk so'ralganda: avval childning o'zida qidiriladi (topilmaydi) → parentda qidiriladi (topilmaydi) → grandparentda qidiriladi (topiladi!). Agar hech qayerda topilmasa, undefined qaytadi.
⚠️ Common Mistake
Prototype chain juda uzun bo'lishi — dasturning sekinlashishiga olib kelishi mumkin, chunki har safar property qidirilganda, JavaScript butun zanjir bo'ylab "yugurishi" kerak bo'ladi.
Bu ikkisi — JavaScript'da eng ko'p chalkashtiriladigan ikki tushuncha, chunki ular bir-biriga o'xshash nomlanadi, lekin butunlay boshqa narsalarni anglatadi.
| Termin | Nimaga tegishli | Vazifasi |
|---|---|---|
__proto__ | Har qanday objectda mavjud | O'sha object'ning haqiqiy prototipiga havola |
prototype | Faqat functionlarda mavjud | Agar bu function new bilan chaqirilsa, yaratiladigan object'larning prototipi shu bo'ladi |
script.jsJavaScriptfunction Person(name) {this.name = name;}Person.prototype.greet = function () {console.log("Salom, men " + this.name);};let user = new Person("Ali");user.greet(); // "Salom, men Ali"console.log(user.__proto__ === Person.prototype); // true
Person.prototype — bu object, unga greet metodi qo'shildi.new Person("Ali") chaqirilganda, JavaScript yangi user object yaratadi.__proto__) — Person.prototypega bog'lanadi.user.greet() chaqirilganda, JavaScript avval userning o'zida greetni qidiradi (yo'q) → keyin user.__proto__ (ya'ni Person.prototype)dan qidiradi (topiladi!).code.textTEXTPerson.prototype ──┐greet: function ││user ────────────────┘ (__proto__ orqali bog'langan)name: "Ali"
🔥 Important
__proto__ni to'g'ridan-to'g'ri ishlatish (obj.__proto__ = ...) hozirgi zamonaviy kodda tavsiya etilmaydi — buning o'rniga Object.getPrototypeOf() va Object.setPrototypeOf() ishlatish afzalroq, yoki (eng yaxshisi) Chapter 22'da o'rganiladigan class sintaksisidan foydalanish.
new kalit so'zi bilan chaqirish uchun mo'ljallangan, katta harf bilan boshlanadigan function'lar — Constructor Function deb ataladi.
script.jsJavaScriptfunction Car(brand, model) {this.brand = brand;this.model = model;}Car.prototype.getInfo = function () {return `${this.brand} ${this.model}`;};let car1 = new Car("Toyota", "Camry");let car2 = new Car("Honda", "Civic");console.log(car1.getInfo()); // "Toyota Camry"console.log(car2.getInfo()); // "Honda Civic"
new Car("Toyota", "Camry") chaqirilganda, JavaScript quyidagi 4 qadamni bajaradi:
{}__proto__si Car.prototypega bog'lanadi.Car function ichidagi kod ishga tushadi, this — yangi yaratilgan object'ga ishora qiladi.this) qaytariladi.💡 Key Idea
Barcha Car orqali yaratilgan object'lar (car1, car2) — getInfo metodini bitta xuddi shu Car.prototypedan meros oladi, ya'ni metod xotirada faqat bir marta saqlanadi, har bir object uchun alohida nusxa yaratilmaydi.
hasOwnProperty() — property object'ning o'zida mavjudmi yoki prototipdan meros olinganmi, shuni tekshiradi.
script.jsJavaScriptlet car = new Car("BMW", "X5");console.log(car.hasOwnProperty("brand")); // true (o'zida bor)console.log(car.hasOwnProperty("getInfo")); // false (prototipdan meros)
🔗 Connection
Bu metod — Chapter 8'dagi for...in loop bilan ishlaganda, faqat object'ning o'z propertylarini (prototipdan meros olinganlarni emas) ajratib olishda foydali.
Task:
Object.create() yordamida vehicle ({ hasWheels: true }) va undan meros oluvchi bicycle object yarating. bicycle.hasWheelsning true ekanini tekshiring.
Required Concepts:
Object.create()let bicycle = Object.create(vehicle);Task:
Book(title, author) nomli constructor function yozing, Book.prototypega getSummary() metodini qo'shing — u "title — author" formatida matn qaytarsin. Ikkita kitob object yarating va metodni sinab ko'ring.
Required Concepts:
prototypeCar misolidan namuna oling.Task:
3 darajali prototype chain yarating: LivingThing (canDie: true) → Animal (canMove: true, Object.create(LivingThing) orqali) → Dog (canBark: true, Object.create(Animal) orqali). Yangi myDog object yaratib, uning barcha 3 xususiyatga ega ekanini tekshiring.
Required Concepts:
Object.create()Object.create() orqali yarating.script.jsJavaScriptfunction Animal(name) {this.name = name;}Animal.prototype.speak = function () {console.log(this.name + " ovoz chiqarmoqda");};let dog = new Animal("Ola");let cat = new Animal("Mushuk");Animal.prototype.speak = function () {console.log(this.name + " YANGI ovoz chiqarmoqda");};dog.speak();
🧠 Think first! Javobni ko'rishdan oldin kamida 30 soniya o'ylang.
<details> <summary>Answer</summary> "Ola YANGI ovoz chiqarmoqda"Why?
dog va cat — speak metodining nusxasini emas, balki Animal.prototypega havolani meros oladi. Shuning uchun Animal.prototype.speak keyinchalik o'zgartirilsa, bu o'zgarish barcha mavjud (va yangi) Animal object'lariga ham darhol ta'sir qiladi — chunki ular hammasi bitta xuddi shu prototipga bog'langan.
Quyidagi kodda muammo bor:
script.jsJavaScriptfunction Person(name) {this.name = name;}Person.prototype.greet = function () {console.log("Salom, " + this.name);};let user = Person("Ali"); // "new" kalit so'zisiz chaqirilganuser.greet();
Your Task:
Yechim:
script.jsJavaScriptlet user = new Person("Ali"); // "new" bilan to'g'ri chaqirilganuser.greet(); // "Salom, Ali"
🔥 Important: Constructor function'ni newsiz chaqirish — ko'p uchraydigan va aniqlashi qiyin xatolardan biri, chunki JavaScript bu haqda ba'zida hech qanday ogohlantirish bermaydi.
</details>prototype — faqat function'larda, new bilan yaratiladigan object'larning shablon-prototipi.__proto__ — har qanday object'ning haqiqiy ichki prototipiga havola.Object.create() — to'g'ridan-to'g'ri prototip zanjiri yaratishning oddiy usuli.hasOwnProperty() — object'ning o'z propertysi yoki meros olinganini ajratadi.script.jsJavaScriptfunction Person(name) {this.name = name;}Person.prototype.greet = function () {console.log("Salom, " + this.name);};let user = new Person("Ali");user.hasOwnProperty("name"); // trueuser.hasOwnProperty("greet"); // falseObject.create(parentObj); // yangi object, prototipi parentObj
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: