سلام دوستان. توی قسمت قبل با مفهوم پروتوتایپ آشنا شدیم و دیدیم که پروتوتایپ‌ها می‌تونن به صورت زنجیر به هم وصل باشن. توی این قسمت می‌خوایم پروتوتایپ‌ها رو یکم بیشتر موشکافی کنیم.

می‌دونیم که هر مقداری که ساخته میشه، یک سری ویژگی‌ها رو از یک آبجکت والد به ارث می‌بره و دیدیم که پروتوتایپ برای یک آبجکت معمولی، کلاس Object هست که این رو میشه با متد getPrototypeOf یا پراپرتی مخفی __proto__ متوجه شد:

const person = {}

person.__proto__; // Object

 

زنجیره پروتوتایپ جایی متوقف میشه که پروتوتایپ یک مقدار (مقدار پراپرتی [[prototype]]) برابر با null باشه:

const person = {}

person.__proto__; // Object
person.__proto__.__proto__; // null

طول زنجیره برای یک آبجکت معمولی 1 هست. اما بیاید طول زنجیره برای رشته‌ها، آرایه‌ها و اعداد رو بررسی کنیم:

const str = "Discover";

str.__proto__ // String
str.__proto__.__proto__; // Object
str.__proto__.__proto__.__proto__; // null
const arr = [];

arr.__proto__ // Array
arr.__proto__.__proto__; // Object
arr.__proto__.__proto__.__proto__; // null
const num = 429;

num.__proto__ // Number
num.__proto__.__proto__; // Object
num.__proto__.__proto__.__proto__; // null

جالب اینجاست که پروتوتایپ آبجکت‌های Array، String و Number، آبجکتِ Object هست و برای همین طول زنجیره برای این کلاس‌ها ۲ هست.

نکته: احتمالاً این رو شنیدیم که همه چیز توی جاوااسکریپت آبجکت هست و شاید با دیدن کدهای بالا به‌خصوص مثال رشته و اعداد، به این نتیجه برسیم که اعداد و رشته‌ها هم نوعی آبجکت هستن. اما اینطور نیست. رشته‌ها و اعداد جز نوع‌های داده‌ای Primitive هستن. یعنی نوع یک رشته واقعا رشته هست و نوع یک عدد واقعا عدد هست. اما چطور برای یک نوع Primitive مثلا رشته، پراپرتی length در دسترس هست؟

const message = "Meow";

message.length; //4

جواب، Wrapper Objects هست. توی مثال بالا وقتی می‌خوایم به یک پراپرتی از رشته (message) دسترسی پیدا کنیم، رشته توی یک آبجکت موقت قرار می‌گیره تا چیزی که نیاز داریم رو ارائه بده. به این آبجکت موقت می‌گن Wrapper. برای مثال آبجکت Wrapper برای یک رشته String و برای اعداد Number هست.