JavaScript Prototip Chain'ni Tushunish

JavaScript-da prototip zanjiri qanday ishlaydi, uning ahamiyati va tili obyektga asoslangan dasturlashda qanday ta'sir qilishi

So'nggi yangilanish: 2024-12-12

JavaScript Prototip Zanjirini Tushunish

Kirish

JavaScript-da merosxo'rlik prototip asosida amalga oshiriladi, bu Java yoki C# kabi tillardagi sinf asosidagi merosxo'rlikdan sezilarli darajada farq qiladi. Prototip zanjirini tushunish JavaScript-ni mukammal o'rganish uchun muhimdir, chunki u tilda ob'ektlar va metodlarning qanday ishlashining asosini tashkil etadi.

Prototip Nima?

Prototip - bu boshqa ob'ektlar unga xos bo'lgan xususiyatlar va metodlarni meros oladigan ob'ekt. JavaScript-da har bir ob'ektning prototip ob'ektiga ichki havola bor. Ushbu havolaga eskirgan __proto__ xossasi yoki tavsiya etilgan Object.getPrototypeOf() metodi orqali kirish mumkin.

Agar ob'ektda biror xususiyat yoki metod topilmasa, JavaScript mexanizmi uni ob'ektning prototipidan izlaydi. Agar u hali ham topilmasa, qidiruv prototip zanjiri bo'ylab davom etadi va oxirida Object.prototypega yetguncha, keyin esa xususiyat topilmasa undefined qaytariladi.

Asosiy Tushunchalar

Prototip Zanjiri

Prototip zanjiri - bu bog'langan ob'ektlar qatori. U siz bilan ishlayotgan ob'ektdan boshlanadi va __proto__ havolalarini yuqori prototiplarga qarab kuzatadi, oxirida Object.prototypega yetadi. Agar kerakli xususiyat yoki metod topilmasa, undefined qaytariladi.

Prototip Xosselari

  1. __proto__: Eskirgan, lekin hali ham keng tarqalgan. U ob'ektning prototipiga havola beradi.
  2. Object.getPrototypeOf(obj): Ob'ektning prototipiga kirish uchun zamonaviy va tavsiya etilgan usul.
  3. Object.prototype: Prototip zanjirining tepasi, alohida tartibda o'rnatilmagan bo'lsa, barcha ob'ektlar tomonidan bo'lishib olinadi.

Konstruktor Funksiyalari

JavaScript-da konstruktor funksiyasi new kalit so'zi bilan ob'ektlar yaratadi. Konstruktor funksiyalari prototiplar orqali ko'p ob'ektlarni umumiy xatti-harakatlar bilan yaratishning qulay usulini taqdim etadi.

Misol:

function Animal(type) {
    this.type = type;
}
Animal.prototype.speak = function() {
    console.log(`${this.type} ovoz chiqaradi.`);
};

const dog = new Animal('It');
dog.speak(); // "It ovoz chiqaradi."

Bu yerda speak metodi Animal.prototypega qo'shilgan. Animal konstruktori bilan yaratilgan har qanday ob'ekt prototip zanjiri orqali speakga kirisha oladi.

Merosxo'rlik Qanday Ishlaydi

Ob'ekt Yaratish va Bog'lash

new bilan konstruktor funksiya chaqirilganda, JavaScript quyidagilarni bajaradi:

  1. Yangi ob'ekt yaratadi.
  2. Yangi ob'ektning prototipini (__proto__) konstruktor prototype xossasiga bog'laydi.
  3. Konstruktor funksiyasini yangi ob'ekt kontekstida bajaradi.

Prototiplarga Metodlar Qo'shish

Prototipda aniqlangan metodlar konstruktor bilan yaratilgan barcha ob'ektlar tomonidan bo'lishib olinadi. Bu xotira nuqtai nazaridan samarali, chunki metodlar har bir ob'ektda takrorlanmaydi.

Misol:

function Bird(name) {
    this.name = name;
}
Bird.prototype.fly = function() {
    console.log(`${this.name} uchmoqda.`);
};

const parrot = new Bird('Kakarakov');
parrot.fly(); // "Kakarakov uchmoqda."

Sinflar va Prototiplar

ES6 class sintaksisini taqdim etgan bo'lsa-da, bu aslida mavjud prototip asosidagi merosxo'rlik tizimining sintaktik qandaydir qulayligi hisoblanadi. JavaScript-dagi sinflar tubida funksiya bo'lib, ularning metodlari prototipga qo'shiladi.

Misol:

class Vehicle {
    constructor(type) {
        this.type = type;
    }
    move() {
        console.log(`${this.type} harakatlanmoqda.`);
    }
}

const car = new Vehicle('Mashina');
car.move(); // "Mashina harakatlanmoqda."

Tubida:

  1. Vehicle funksiya hisoblanadi.
  2. move metodi Vehicle.prototypega qo'shiladi.

instanceof Operatori

instanceof operatori ob'ektning prototip zanjirida konstruktor funksiyasining prototip xossasining borligini tekshiradi.

Misol:

console.log(car instanceof Vehicle); // true
console.log(car instanceof Object);  // true

Bu car ob'ektining prototip zanjiri Vehicle.prototype va Object.prototypeni o'z ichiga oladi.

Amaliy Qo'llanma va Xatoliklar

Umumiy Qo'llanma Holatlari

  1. Metodlarni Bo'lishish: Prototiplar bir xil konstruktor bilan yaratilgan ob'ektlar uchun metodlarni bo'lishib olishga imkon beradi.
  2. Dinamik Xatti-Harakatlar: Ob'ektlar yaratilgandan keyin ham prototiplarga xususiyatlar yoki metodlar qo'shish mumkin.

Xatoliklar

  1. Prototiplarni Qayta Yozish: Ob'ektning prototipini almashtirish merosxo'rlikni buzishi mumkin.
    Bird.prototype = { walk: function() {} };
    const eagle = new Bird('Burgut');
    eagle.fly(); // Xato: fly funksiya emas
    
  2. __proto__ va prototype o'rtasidagi farqni tushunmaslik: Esda tutingki, __proto__ ob'ektning haqiqiy prototipidan iborat, prototype esa konstruktor funksiyalarining xossasidir.

Xulosa

  • Prototip zanjiri JavaScript merosxo'rligining asosiy tushunchasi hisoblanadi.
  • Ob'ektlar xususiyatlar va metodlarni prototip havolasi orqali meros oladi.
  • Konstruktor funksiyalari va sinflar metodlarni samarali bo'lishib olish uchun prototiplardan foydalanadi.
  • Prototip zanjirini tushunish JavaScript-ning xatti-harakatini tushunishga va nosozliklarni tuzatishni osonlashtiradi.

Qo'shimcha Manbalar

Keyinchalik prototiplar va prototip chain'ga chuqurroq kirish uchun quyidagi manbalarni ko'rib chiqing:

  1. MDN Web Docs - Inheritance and the prototype chain
  2. MDN Web Docs - Object prototypes
  3. Detailed Explanation of JavaScript Prototype Chain
  4. The prototype chain: how JavaScript really works