Sobes.tech
Junior

JavaScriptda merosxo'r qanday ishlashini tushuntiring.

sobes.tech AI

AIdan javob

JavaScriptda meroslashish prototiplar orqali amalga oshiriladi. Har bir JavaScript obyekti ichki [[Prototype]] xususiyatiga ega bo'lib, u boshqa obyekti bilan bog'langan. Ob'ektning to'g'ridan-to'g'ri uning ustida bo'lmagan xususiyat yoki metodga kirishga harakat qilganimizda, JavaScript motori bu xususiyat yoki metodni ob'ektning prototipida qidiradi. Agar u topilmasa, qidiruv [[Prototype]] bog'lanishlari orqali hosil bo'lgan prototip zanjirida davom etadi va null ga (zanjir oxiri) yetguncha davom etadi.

Ikki asosiy meros olish mexanizmi mavjud:

  1. Klassik prototip meros olish (ES5 va avvalgi): Konstruktor funksiyalar va ularning prototype xususiyatidan foydalanishga asoslangan.

    // Konstruktor funksiyasi
    function Animal(name) {
      this.name = name;
    }
    
    // Prototipga metod qo'shish
    Animal.prototype.speak = function() {
      console.log(`${this.name} tovush chiqaradi.`);
    };
    
    // Namuna yaratish
    const dog = new Animal('It');
    
    // Prototipdan metodni chaqirish
    dog.speak(); // Chiqish: It tovush chiqaradi.
    
    // Cat ning prototipi Animal.prototype
    console.log(Object.getPrototypeOf(dog) === Animal.prototype); // true
    
  2. Klassga asoslangan meros olish (ES6 va undan keyingi): class va extends sintaksisidan foydalanadi, bu esa ichki ravishda prototiplar bilan ishlashda davom etadi.

    // Asosiy sinf
    class Animal {
      constructor(name) {
        this.name = name;
      }
    
      speak() {
        console.log(`${this.name} tovush chiqaradi.`);
      }
    }
    
    // Animal dan meros oluvchi subclass
    class Dog extends Animal {
      constructor(name, breeds) {
        super(name); // Ota sinf konstruktorini chaqirish
        this.breeds = breeds;
      }
    
      bark() {
        console.log(`${this.name} baqiradi.`);
      }
    }
    
    // Subclassning namunasini yaratish
    const myDog = new Dog('Bublik', ['Labrador', 'Collie']);
    
    // Animal va Dog metodlarini chaqirish
    myDog.speak(); // Chiqish: Bublik tovush chiqaradi.
    myDog.bark();  // Chiqish: Bublik baqiradi.
    
    // myDog ning prototipi Dog.prototype
    console.log(Object.getPrototypeOf(myDog) === Dog.prototype); // true
    
    // Dog.prototype ning prototipi Animal.prototype
    console.log(Object.getPrototypeOf(Dog.prototype) === Animal.prototype); // true
    

Asosiy tushunchalar:

  • Prototip zanjiri: Ob'ektlar orasidagi [[Prototype]] orqali bog'lanish.

  • __proto__ (eski/standart bo'lmagan, ammo tushunishda foydali): Bu xususiyat orqali [[Prototype]] ga kirish mumkin. Ishlab chiqarishda foydalanish tavsiya etilmaydi.

  • Object.getPrototypeOf(obj) : Ob'ektning prototipini olish uchun standart usul.

  • Object.setPrototypeOf(obj, proto) : Ob'ektning prototipini o'zgartirish uchun standart usul (mavjud ob'ektlarning prototipini o'zgartirish tavsiya etilmaydi).

  • instanceof : Ob'ektning ma'lum bir sinf yoki konstruktor funksiyasining nusxasi ekanligini tekshirish uchun ishlatiladi, uning prototip zanjiri orqali.

    console.log(myDog instanceof Dog);   // true
    console.log(myDog instanceof Animal); // true
    console.log(myDog instanceof Object); // true (zanjir oxirida Object.prototype)
    
  • super : Sinflarda ota sinf metodlarini yoki konstruktorini chaqirish uchun ishlatiladi.

Klassik va klassga asoslangan yondashuvlar o'rtasidagi farq: Sinflar prototip meros bilan ishlashni yanada tuzilgan va sintaktik jihatdan qulayroq qilish uchun taqdim etadi, boshqa dasturlash tillariga yaqinroq. Biroq, asosiy mexanizm o'zgarmas — prototiplar orqali meros olish.