Məzmuna keçin
  • Kateqoriyalar
  • Ən yeni
  • Teqlər
  • Populyar
Yığmaq
Brend loqosu
  1. Əsas səhifə
  2. Front-end
  3. JavaScript
  4. JavaScript-də Prototype Chain (Prototip Zənciri)

JavaScript-də Prototype Chain (Prototip Zənciri)

Planlaşdırılıb Sabitlənib Kilidlənib Köçürülüb JavaScript
protoprototypeobjectchain
3 Yazı 1 Yazarlar 81 Baxış
  • Ən köhnədən yeniyə
  • Ən yenidən köhnəyə
  • Ən çox səs
Cavab ver
  • Mövzu olaraq cavablandır
🔑 Daxil ol
Bu mövzu silindi. Yalnız mövzu idarəçiliyi imtiyazlarına malik olan istifadəçilər onu görə bilər.
  • codexC Oflayn
    codexC Oflayn
    codex
    yazdı sonuncu dəfə tərəfindən redaktə edilib
    #1

    JavaScript obyekt yönümlü proqramlaşdırma (OOP) yanaşmasını prototip əsaslı sistem vasitəsilə həyata keçirir. Bu, digər obyektlərin xüsusiyyətlərini miras almaq üçün klassik classlardan istifadə etmədən, obyektlər arasında birbaşa əlaqə qurulmasına imkan verir. Bu prosesə Prototype Chain, yəni Prototip Zənciri deyilir.


    🔧 Prototip nədir?

    JavaScript-də hər bir obyektin arxasında [[Prototype]] adlı gizli bir xüsusiyyət var. Bu xüsusiyyət digər obyektə (və ya null-a) istinad edir. Əgər siz bir obyektin içində müəyyən xüsusiyyət və ya metod axtarırsınızsa, JavaScript əvvəlcə həmin obyektin özündə yoxlayır, əgər tapa bilmirsə, onun prototipində axtarmağa davam edir. Bu proses Prototip Zəncirini təşkil edir.


    🔗 Prototip zəncirinin iş prinsipi

    Tutaq ki, bir obyektin içində sayHello() adlı metod yoxdur. JavaScript bu metodu həmin obyektin [[Prototype]]-ində axtarır. Əgər orada da tapa bilmirsə, növbəti prototipə keçir və bu proses null-a qədər davam edir.


    🧪 Nümunə ilə izah

    const animal = {
      eats: true,
      walk() {
        console.log("Animal is walking");
      }
    };
    
    const rabbit = {
      jumps: true
    };
    
    rabbit.__proto__ = animal; // rabbit-in prototipi animal-dır
    
    console.log(rabbit.jumps); // true (öz xüsusiyyəti)
    console.log(rabbit.eats);  // true (animal-dan miras alır)
    rabbit.walk();             // "Animal is walking"
    

    Bu nümunədə rabbit obyektində eats xüsusiyyəti yoxdur. Lakin animal onun prototipidir, ona görə rabbit.eats sorğusu true nəticəsini qaytarır.


    📐 Prototip zəncirində dərinlik

    const creature = {
      breathes: true
    };
    
    const animal = {
      eats: true,
      __proto__: creature
    };
    
    const rabbit = {
      jumps: true,
      __proto__: animal
    };
    
    console.log(rabbit.breathes); // true (creature-dan gəlir)
    

    Burada rabbit → animal → creature zənciri qurulub. rabbit.breathes çağırışı 3 səviyyəli zəncir vasitəsilə true cavabı verir.


    🔁 Prototiplər və Constructor funksiyalar

    function Person(name) {
      this.name = name;
    }
    
    Person.prototype.sayHello = function () {
      console.log("Salam, mənim adım " + this.name);
    };
    
    const user = new Person("Elvin");
    user.sayHello(); // Salam, mənim adım Elvin
    

    Burada user obyektinin sayHello metodu özündə yoxdur. JavaScript onun konstruktorunun (Person) prototype obyektinə baxır və oradan tapır.


    🧬 Object.prototype və Zəncirin sonu

    JavaScript-də bütün obyektlər nəticədə Object.prototype-dən miras alır.

    const obj = {};
    console.log(obj.toString()); // [object Object]
    

    Burada toString metodu obj-də yoxdur, lakin Object.prototype-də olduğu üçün işləyir. Ən sonda zəncir null ilə bitir:

    console.log(Object.prototype.__proto__); // null
    

    ⚠️ Diqqət: __proto__ istifadəsi

    __proto__ hələ də geniş istifadə olunur, lakin standart və tövsiyə edilən üsul Object.getPrototypeOf() və Object.setPrototypeOf() metodlarıdır.

    Object.setPrototypeOf(rabbit, animal);
    console.log(Object.getPrototypeOf(rabbit)); // animal
    

    📌 Nəticə

    • Prototip Zənciri obyektlər arasında əlaqə quraraq xüsusiyyət və metodları miras almağa imkan verir.
    • Obyektdə axtarılan xüsusiyyət tapılmadıqda, onun prototipində axtarılır və bu, null-a qədər davam edir.
    • Function.prototype, Object.prototype və digər daxili obyektlər bu zəncirin hissələridir.
    • Zəncir çox dərinə getsə belə, performans baxımından effektiv şəkildə işləyir.
    • __proto__ istifadə olunsa da, müasir və təhlükəsiz metodlar Object.getPrototypeOf() və Object.setPrototypeOf() hesab olunur.

    Təşəkkürlər ColorCode gözəl izahlı video üçün

    1 cavab Son cavab
    • codexC Oflayn
      codexC Oflayn
      codex
      yazdı sonuncu dəfə tərəfindən redaktə edilib
      #2

      🧬 Object.create() vasitəsilə İrsi əlaqə (Inheritance)

      JavaScript-də irsi əlaqə qurmağın başqa bir güclü və sadə yolu Object.create() metodudur. Bu metod vasitəsilə yeni bir obyekt yaradılır və bu obyektin prototipi kimi istədiyimiz digər bir obyekt təyin edilir.

      Bu üsul klassik constructor-lar və prototype zənciri qurmaqdan daha sadə və daha oxunaqlıdır.

      🧪 Nümunə:

      const animal = {
        eats: true,
        walk() {
          console.log("Animal is walking");
        }
      };
      
      const rabbit = Object.create(animal);
      rabbit.jumps = true;
      
      console.log(rabbit.eats);  // true (animal-dan miras alır)
      rabbit.walk();             // "Animal is walking"
      console.log(rabbit.jumps); // true (öz xüsusiyyəti)
      

      Bu nümunədə:

      • rabbit obyektini Object.create(animal) ilə yaratmışıq.
      • rabbit obyektində eats xüsusiyyəti yoxdur, lakin animal onun prototipidir, ona görə həmin xüsusiyyətə çatmaq mümkündür.
      • Bu, prototip zəncirinin bir hissəsidir və miras alınmış metod və xüsusiyyətlər animal obyektindən gəlir.

      ✅ Object.create() istifadəsinin üstünlükləri:

      • Daha sadə sintaksis.
      • Klassik constructor funksiyalarına ehtiyac olmadan obyekt əsaslı irsilik qurmaq imkanı.
      • Müxtəlif obyektlər arasında açıq şəkildə əlaqə yaratmaq olur.
      • Test və prototipləşdirmə üçün çox uyğundur və çevikdir.

      Beləliklə, Object.create() JavaScript-də irsi əlaqənin daha bir güclü vasitəsidir və Prototype Chain anlayışının birbaşa tətbiqini nümayiş etdirir. Bu metod xüsusilə funksional proqramlaşdırma yanaşmalarında və modul sistemlərində tez-tez istifadə olunur.

      1 cavab Son cavab
      • codexC Oflayn
        codexC Oflayn
        codex
        yazdı sonuncu dəfə tərəfindən redaktə edilib
        #3

        Bu 10 sual vasitəsilə JavaScript-in prototype zənciri, __proto__, prototype, Object.create(), constructor funksiyalar və new-in daxili iş prinsipi ətraflı şəkildə izah olundu. Bu biliklər JavaScript-i daha dərin anlamaq və daha güclü tətbiqlər yazmaq üçün vacibdir.

        ✅ 1. Prototype zənciri nədir?

        Cavab: Prototype zənciri — JavaScript obyektlərinin digər obyektlərdən metod və propertiləri irsi olaraq almasına imkan verən mexanizmdir. JavaScript-də hər obyektin __proto__ adlı gizli bir xassəsi olur və bu xassə həmin obyektin hansı digər obyektdən miras aldığını göstərir. Axtarılan property obyektin özündə yoxdursa, JavaScript həmin property-ni zəncir üzrə yuxarıdakı prototiplərdə axtarır.


        ✅ 2. __proto__ və prototype arasında fərq nədir?

        Cavab:

        • __proto__ — istənilən obyektin daxili [[Prototype]] (gizli irsi əlaqəsi) istinadıdır.
        • prototype — yalnız constructor funksiyalara (məsələn, function A() {}) aid olan xassədir və new ilə yaradılmış obyektlərin __proto__su bu prototype-ə istinad edir.

        Sadə desək:

        const obj = new Constructor();
        obj.__proto__ === Constructor.prototype // true
        


        ✅ 3. Aşağıdakı kodun nəticəsi nə olacaq? İzah edin.

        function Person(name) {
          this.name = name;
        }
        Person.prototype.greet = function() {
          return "Hello, " + this.name;
        };
        
        const p1 = new Person("John");
        
        console.log(p1.greet()); // ?
        console.log(p1.__proto__ === Person.prototype); // ?
        

        Cavab:

        • p1.greet() → "Hello, John" — çünki greet metodu Person.prototype-dədir.
        • p1.__proto__ === Person.prototype → true — çünki new ilə yaradılmış obyektlərin __proto__su həmin constructor-un prototype-inə bərabər olur.


        ✅ 4. JavaScript-də __proto__ necə işləyir?

        Cavab: JavaScript obyekt üzərində bir property tapmayanda, avtomatik olaraq __proto__ vasitəsilə onun prototipinə baxır. Bu proses zəncirvari davam edir — yuxarı prototiplərə baxılır — ta ki null-a çatana qədər (Object.prototype.__proto__ === null).


        ✅ 5. Bu kod niyə işləmir?

        const obj = {
          name: "Elvin",
          sayHi: function() {
            return "Hi " + this.name;
          }
        };
        
        obj.prototype = function sayHi() {
          return "Hello " + this.name;
        };
        obj.sayHi();
        

        Cavab: Burada səhv odur ki, obj adi obyekt olduğu üçün onun prototype property-si işləmir. prototype yalnız constructor funksiyalar üçün işləyir. Bu şəkildə olmalı idi:

        function Person(name) {
          this.name = name;
        }
        Person.prototype.sayHi = function() {
          return "Hello " + this.name;
        };
        


        ✅ 6. Aşağıdakı kodun nəticəsi nə olacaq? Niyə?

        const animal = {
          eats: true
        };
        
        const rabbit = Object.create(animal);
        rabbit.jumps = true;
        
        console.log(rabbit.eats);  // ?
        console.log(rabbit.jumps); // ?
        console.log(animal.jumps); // ?
        

        Cavab:

        • rabbit.eats → true — irsi olaraq animal-dan gəlir
        • rabbit.jumps → true — öz property-dir
        • animal.jumps → undefined — çünki jumps yalnız rabbit-ə aiddir


        ✅ 7. Object.create() nədir və onu new əvəzinə nə vaxt istifadə edərik?


        Cavab:

        • Object.create(proto) — yeni bir obyekt yaradır və onun __proto__-sunu verdiyimiz proto obyektinə bağlayır.
        • new ilə müqayisədə Object.create() bizə birbaşa prototipi təyin etməyə imkan verir. Əgər constructor funksiyadan istifadə etmiriksə, sadə obyekt irsiliyi üçün Object.create() daha uyğundur.


        ✅ 8. Bu kodun nəticəsi nədir? Niyə?

        function A() {}
        A.prototype = {
          sayHello: function() {
            return 'Hello from A';
          }
        };
        
        const obj = new A();
        
        A.prototype = {
          sayHello: function() {
            return 'Hello from modified A';
          }
        };
        
        console.log(obj.sayHello());
        

        Cavab: obj.sayHello() → "Hello from A"
        Çünki obj yaradıldıqdan sonra A.prototype dəyişdirilsə də, obj artıq köhnə prototipi saxlayır. Yeni prototype ancaq sonrakı instansiyalara təsir edərdi.


        ✅ 9. new əməliyyatını özümüz necə implement edə bilərik?

        Cavab:

        function myNew(Constructor, ...args) {
          const obj = {};
          Object.setPrototypeOf(obj, Constructor.prototype);
          const result = Constructor.apply(obj, args);
          return typeof result === 'object' && result !== null ? result : obj;
        }
        

        Bu funksiyamız:

        1. Boş obyekt yaradır
        2. Onun __proto__sunu constructor-un prototype-inə bağlayır
        3. Constructor-u həmin obyektə this kimi tətbiq edir
        4. Əgər constructor obyekt qaytarmırsa, yeni obyekt qaytarılır


        ✅ 10. Bu kodun nəticəsi nə olacaq? Niyə dəyişir?

        const grandParent = {
          greet: function() {
            return "Hello from GrandParent";
          }
        };
        
        const parent = Object.create(grandParent);
        const child = Object.create(parent);
        
        parent.greet = function() {
          return "Hello from Parent";
        };
        
        console.log(child.greet());
        delete parent.greet;
        console.log(child.greet());
        

        Cavab:

        • Birinci console.log → "Hello from Parent" — çünki child.greet() zəncirdə parent-da tapılır
        • İkinci console.log → "Hello from GrandParent" — çünki parent.greet silinib və JavaScript irsi olaraq grandParent-a baxır

        1 cavab Son cavab
        Cavab ver
        • Mövzu olaraq cavablandır
        🔑 Daxil ol
        • Ən köhnədən yeniyə
        • Ən yenidən köhnəyə
        • Ən çox səs




        Bilik paylaşdıqca artan bir sərvətdir
        • Daxil ol

        • Sizin hesabınız yoxdur? Qeydiyyatdan keç

        • Axtarış etmək üçün daxil olun və ya qeydiyyatdan keçin.
        • İlk yazı
          Son yazı
        0
        • Kateqoriyalar
        • Ən yeni
        • Teqlər
        • Populyar