JavaScript-də Prototype Chain (Prototip Zənciri)
-
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ə yanull
-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 prosesnull
-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. Lakinanimal
onun prototipidir, ona görərabbit.eats
sorğusutrue
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
obyektininsayHello
metodu özündə yoxdur. JavaScript onun konstruktorunun (Person
)prototype
obyektinə baxır və oradan tapır.
🧬
Object.prototype
və Zəncirin sonuJavaScript-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
metoduobj
-də yoxdur, lakinObject.prototype
-də olduğu üçün işləyir. Ən sonda zəncirnull
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 üsulObject.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 metodlarObject.getPrototypeOf()
vəObject.setPrototypeOf()
hesab olunur.
Təşəkkürlər ColorCode gözəl izahlı video üçün
-
🧬
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
obyektiniObject.create(animal)
ilə yaratmışıq.rabbit
obyektindəeats
xüsusiyyəti yoxdur, lakinanimal
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.
Bilik paylaşdıqca artan bir sərvətdir