در جاوااسکریپت، زمانی که آبجکتها ایجاد میشوند، برخی از پراپرتیها و متدها را از آبجکت prototype به ارث میبرند. آبجکت prototype مانند یک طرح و الگو برای سایر آبجکتها عمل میکند، مشابه کلاسها در ES6+.
به عنوان مثال، همه رشتهها دارای متدهای پیشفرضی مانند replace و split و همچنین یک پراپرتی به نام length هستند. هنگامی که یک رشته ساخته میشود، متدها و پراپرتیها از String.prototype به ارث میآیند. بنابراین، اگر ما آبجکت String.prototype را ویرایش کرده و به آن یک متد اضافه کنیم، آن متدها و پراپرتیها در سایر رشتهها نیز در دسترس خواهند بود.
در جاوااسکریپت هر آبجکتی یک پراپرتی مخفی داره به اسم [(prototype)] داره که به عنوان یک لینک یا واسط برای دسترسی به نمونه ای والد در نظر گرفته می شود. برا اینکه prototype یا نمونه اولیه یا به زبان ساده والد آبجکت را ببینیم به این شکل عمل میکنیم:
هر آبجکت در جاوااسکریپت یک پراپرتی داخلی به نام [(prototype )] دارد که به یک آبجکت دیگر اشاره میکند. این آبجکت معمولاً به عنوان prototype معروف است.
اگر یک ویژگی یا متد در آبجکت پیدا نشود، جاوااسکریپت به طور خودکار به prototype آبجکت و سپس به prototype آن prototype مراجعه میکند و این روند ادامه پیدا میکند. این زنجیره را "prototype chain" مینامیم.
چطوری میتونیم یک آبجکت بدون prototype بسازیم؟
const obj = Object.create(null);