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. -
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 buprototype
-ə 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"
— çünkigreet
metoduPerson.prototype
-dədir.p1.__proto__ === Person.prototype
→true
— çünkinew
ilə yaradılmış obyektlərin__proto__
su həmin constructor-unprototype
-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 kinull
-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 onunprototype
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 olaraqanimal
-dan gəlirrabbit.jumps
→true
— öz property-diranimal.jumps
→undefined
— çünkijumps
yalnızrabbit
-ə aiddir
7.
Object.create()
nədir və onunew
əvəzinə nə vaxt istifadə edərik?
Cavab:Object.create(proto)
— yeni bir obyekt yaradır və onun__proto__
-sunu verdiyimizproto
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 üçünObject.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"
Çünkiobj
yaradıldıqdan sonraA.prototype
dəyişdirilsə də,obj
artıq köhnə prototipi saxlayır. Yeniprototype
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:
- Boş obyekt yaradır
- Onun
__proto__
sunu constructor-unprototype
-inə bağlayır - Constructor-u həmin obyektə
this
kimi tətbiq edir - Ə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"
— çünkichild.greet()
zəncirdəparent
-da tapılır - İkinci
console.log
→"Hello from GrandParent"
— çünkiparent.greet
silinib və JavaScript irsi olaraqgrandParent
-a baxır
Bilik paylaşdıqca artan bir sərvətdir