Prototype چییە؟

لە JavaScript-دا، هەموو Object-ێک بەستراوەتەوە بە Object-ێکی ترەوە کە پێی دەوترێت Prototype. ئەم Prototype-ە وەک سەرچاوەیەک کاردەکات بۆ ئەوەی Object-ەکان بتوانن تایبەتمەندی (Properties) و فەنکشنەکان (Methods) لە یەکتر وەربگرن.

کاتێک تۆ هەوڵدەدەیت دەستت بگات بە تایبەتمەندییەکی Object-ێک، JavaScript سەرەتا لەناو خودی Object-ەکەدا دەگەڕێت. ئەگەر نەیدۆزیەوە، ئەوا دەچێتە سەر Prototype-ەکەی و لەوێ بەدوایدا دەگەڕێت. ئەم زنجیرەیە پێی دەوترێت Prototype Chain.

تێبینی: JavaScript زمانێکی Prototype-based-ە، ئەمەش جیاوازە لەو زمانانەی کە Class-based-ن (وەک Java یان C#). لە JavaScript-دا ئێمە زیاتر پشت بە Object-ەکان دەبەستین نەک تەنها Class-ەکان.

دروستکردنی 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 دروست بکە و فەنکشنەکە تاقی بکەرەوە.