Prototype چییە؟
لە JavaScript-دا، هەموو Object-ێک بەستراوەتەوە بە Object-ێکی ترەوە کە پێی دەوترێت Prototype. ئەم Prototype-ە وەک سەرچاوەیەک کاردەکات بۆ ئەوەی Object-ەکان بتوانن تایبەتمەندی (Properties) و فەنکشنەکان (Methods) لە یەکتر وەربگرن.
کاتێک تۆ هەوڵدەدەیت دەستت بگات بە تایبەتمەندییەکی Object-ێک، JavaScript سەرەتا لەناو خودی Object-ەکەدا دەگەڕێت. ئەگەر نەیدۆزیەوە، ئەوا دەچێتە سەر Prototype-ەکەی و لەوێ بەدوایدا دەگەڕێت. ئەم زنجیرەیە پێی دەوترێت Prototype Chain.
دروستکردنی Prototype بە بەکارهێنانی Constructor
کاتێک فەنکشنێکی Constructor دروست دەکەیت، JavaScript بە شێوەیەکی خۆکار تایبەتمەندییەکی بۆ زیاد دەکات بە ناوی prototype. هەر شتێک لەم prototype-ەدا دابنێیت، لەلایەن هەموو ئەو Object-انەوە دەبینرێت کە بەو Constructor-ە دروستکراون.
function Car(brand) {
this.brand = brand;
}
// زیادکردنی فەنکشن بۆ Prototype
Car.prototype.displayInfo = function() {
console.log('ئەم ئۆتۆمبێلە جۆرەکەی: ' + this.brand);
};
const myCar = new Car('Toyota');
myCar.displayInfo(); // دەرەنجام: ئەم ئۆتۆمبێلە جۆرەکەی: Toyota
لە نموونەکەدا، فەنکشنی displayInfo تەنها جارێک لە بیرگەدا (Memory) پاشەکەوت دەکرێت، بەڵام هەموو ئۆتۆمبێلەکانی Car دەتوانن بەکاریبهێنن.
هەڵەی باو
هەڵەی باو ئەوەیە کە فەنکشنەکە لەناو خودی Car-دا بنووسیت لەبری Car.prototype. ئەگەر لەناو Car-دا بنووسیت، بۆ هەر ئۆتۆمبێلێکی نوێ، کۆپییەکی نوێی فەنکشنەکە دروست دەبێت و بیرگەی زیاتر بەکاردەهێنێت.
زنجیرەی Prototype (Prototype Chain)
ئەگەر Prototype-ێکیش خۆی Prototype-ێکی هەبێت، زنجیرەکە بەردەوام دەبێت تا دەگاتە Object.prototype و لە کۆتاییدا null.
const animal = { eats: true };
const rabbit = Object.create(animal);
console.log(rabbit.eats); // true
console.log(rabbit.hasOwnProperty('eats')); // false
لێرەدا rabbit خاوەنی eats نییە، بەڵام لە animal-ەوە وەریگرتووە.
Object.prototype مەکە بە زیادکردنی فەنکشنی نوێ، چونکە ئەمە کاریگەری لەسەر هەموو Object-ەکانی پرۆگرامەکەت دەبێت و دەبێتە هۆی کێشەی نەخوازراو.
بەکارهێنانی __proto__
تایبەتمەندی __proto__ ڕێگەیەکی کۆن و ڕاستەوخۆیە بۆ بینینی Prototype-ی Object-ێک. هەرچەندە لە کۆدکردنی مۆدێرندا زیاتر Object.getPrototypeOf() بەکاردێت، بەڵام تێگەیشتن لە __proto__ بۆ تێگەیشتن لە زنجیرەکە زۆر گرنگە.
const user = { name: 'Ali' };
console.log(user.__proto__ === Object.prototype); // true
میراتگرتن (Inheritance) لە ڕێگەی Prototype
دەتوانیت Object-ێک دروست بکەیت کە تایبەتمەندییەکانی Object-ێکی تر وەربگرێت. ئەمە بنەمای میراتگرتنە لە JavaScript.
ڕاهێنانی پراکتیکی
هەوڵبدە Object-ێک بە ناوی Person دروست بکەیت کە تایبەتمەندی name-ی هەبێت. پاشان لە ڕێگەی Person.prototype فەنکشنێک زیاد بکە بە ناوی greet کە ناوی کەسەکە چاپ بکات. دواتر Object-ێکی نوێ لە Person دروست بکە و فەنکشنەکە تاقی بکەرەوە.