Sobes.tech
Junior

JavaScript-də irsiyyətin necə işlədiyini izah edin.

sobes.tech Süni İntellekt

AI-dan cavab

JavaScript-də irsiyyət prototiplər vasitəsilə həyata keçirilir. JavaScript-də hər bir obyektin daxili [[Prototype]] xüsusiyyəti var və bu, başqa bir obyektə istinad edir. Bir obyektin birbaşa özündə olmayan xüsusiyyət və ya metoduna daxil olmaq istədikdə, JavaScript mühərriki bu xüsusiyyət və ya metodu həmin obyektin prototipində axtarır. Əgər tapmazsa, prototiplər zənciri boyunca axtarış davam edir və null-a (zəncirin sonu) çatana qədər davam edir.

İrsiyyətin iki əsas mexanizmi mövcuddur:

  1. Klassik prototip irsiyyəti (ES5 və əvvəlki): Bu, funksiyalar-constructors və onların prototype xüsusiyyəti istifadə edilərək həyata keçirilir.

    // Constructor funksiyası
    function Heyvan(ad) {
      this.ad = ad;
    }
    
    // Prototipə metod əlavə et
    Heyvan.prototype.söhbət = function() {
      console.log(`${this.ad} səs çıxarır.`);
    };
    
    // Nümunə yaradılır
    const it = new Heyvan('İt');
    
    // Prototipdən metodu çağırırıq
    it.söhbət(); // Çıxış: İt səs çıxarır.
    
    // `dog`-un prototipi `Heyvan.prototype`-dir
    console.log(Object.getPrototypeOf(it) === Heyvan.prototype); // true
    
  2. Klass irsiyyəti (ES6 və sonrası): Bu, classextends sintaksisindən istifadə edir və alt qatda prototiplərlə işləyir.

    // Əsas sinif
    class Heyvan {
      constructor(ad) {
        this.ad = ad;
      }
    
      söhbət() {
        console.log(`${this.ad} səs çıxarır.`);
      }
    }
    
    // Alt sinif, Heyvan-dan irs alır
    class İt extends Heyvan {
      constructor(ad, cinslər) {
        super(ad); // Ata sinifin konstruktorunu çağırır
        this.cinslər = cinslər;
      }
    
      havlama() {
        console.log(`${this.ad} havlayır.`);
      }
    }
    
    // Alt sinif nümunəsi yaradılır
    const mənimİtim = new İt('Bublik', ['Labrador', 'Collie']);
    
    // Hem Heyvan, hem də İt metodlarını çağırırıq
    mənimİtim.söhbət(); // Çıxış: Bublik səs çıxarır.
    mənimİtim.havlama();  // Çıxış: Bublik havlayır.
    
    // `mənimİtim`-in prototipi `İt.prototype`-dir
    console.log(Object.getPrototypeOf(mənimİtim) === İt.prototype); // true
    
    // `İt.prototype`-in prototipi `Heyvan.prototype`-dir
    console.log(Object.getPrototypeOf(İt.prototype) === Heyvan.prototype); // true
    

Əsas anlayışlar:

  • Prototip zənciri: Obyektlər arasındakı əlaqə [[Prototype]] vasitəsilə.

  • __proto__ (köhnə/standart olmayan, amma anlama üçün faydalı): [[Prototype]]-ə giriş üçün istifadə olunur. İstehsal kodunda istifadə etmək tövsiyə edilmir.

  • Object.getPrototypeOf(obj): Obyektin prototipini almaq üçün standart üsul.

  • Object.setPrototypeOf(obj, proto): Obyektin prototipini dəyişmək üçün standart üsul (mövcud obyektlərin prototipini dəyişmək üçün tövsiyə edilmir).

  • instanceof: Obyektin sinif və ya konstruktor funksiyasının nümunəsi olub-olmadığını yoxlamaq üçün istifadə olunur.

    console.log(mənimİtim instanceof İt);   // true
    console.log(mənimİtim instanceof Heyvan); // true
    console.log(mənimİtim instanceof Object); // true (zəncirin sonunda Object.prototype)
    
  • super: Siniflərdə valideyn sinifin metod və ya konstruktorunu çağırmaq üçün istifadə olunur.

Klassik və klasssız yanaşma arasındakı fərq: Klasslar, prototip irsiyyət ilə işləmək üçün daha strukturlaşdırılmış və sintaktik olaraq rahat bir yol təqdim edir, digər proqramlaşdırma dillərinə yaxınlaşır. Ancaq əsas mexanizm eyni qalır — prototiplər vasitəsilə irsiyyət.