در جاوااسکریپت، پروتوتایپ ویژگیای از اشیاء است که به ارجاع ویژگیها مربوط میشود. پروتوتایپ پیوندی پنهان بین دو شیء است که هنگام ساخت شیء ایجاد میشود. این پیوند باعث میشود اگر شیء فعلی ویژگیای نداشته باشد، آن را از شیء مرجع دریافت کند.
وقتی چند شیء بهصورت زنجیرهای به یکدیگر لینک شده باشند، به آن زنجیرهٔ پروتوتایپ گفته میشود. این زنجیره امکان همکاری بین اشیاء را فراهم میکند.
var homework = { topic: "JS" };
homework.toString(); // [object Object]شیء homework متدی به نام toString ندارد، اما از طریق پروتوتایپ به Object.prototype ارجاع داده میشود.
var homework = { topic: "JS" };
var otherHomework = Object.create(homework);
otherHomework.topic; // "JS"
otherHomework.topic = "Math";
homework.topic; // "JS"در این مثال، otherHomework به homework لینک شده، اما با انتساب مستقیم، ویژگی topic روی خود otherHomework ایجاد میشود و ویژگی اصلی را shadow میکند.
Object.create(null) شیئی بدون هیچ پروتوتایپ میسازد — کاملاً مستقل.
در جاوااسکریپت، this به زمینهٔ اجرایی وابسته است، نه محل تعریف تابع. این ویژگی باعث میشود متدهای ارجاعشده از طریق پروتوتایپ همچنان به دادههای شیء فراخوانیکننده دسترسی داشته باشند.
var homework = {
study() {
console.log(`Please study ${this.topic}`);
}
};
var jsHomework = Object.create(homework);
jsHomework.topic = "JS";
jsHomework.study(); // Please study JS
var mathHomework = Object.create(homework);
mathHomework.topic = "Math";
mathHomework.study(); // Please study Mathدر اینجا، متد study از homework ارجاع داده شده، اما this به شیء فراخوانیکننده اشاره دارد — یعنی jsHomework یا mathHomework.
پروتوتایپها در جاوااسکریپت مکانیزمی قدرتمند برای تفویض ویژگیها و متدها هستند. با استفاده از Object.create میتوان زنجیرههای منطقی ساخت. همچنین، رفتار پویا this در فراخوانی متدها باعث میشود ارجاعها بهدرستی عمل کنند. شناخت این مفاهیم برای طراحی شیگرا و کدهای قابلنگهداری ضروری است.