برنامه نویسی 159 بازدید

در این نوشته به بررسی مفهوم شیء در جاوا اسکریپت خواهیم پرداخت. برای مطالعه این راهنما توصیه می‌شود درکی اولیه از انواع داده در جاوا اسکریپت داشته باشید. آشنایی مقدماتی با موضوعات دیگر جاوا اسکریپت نیز به درک بهتر این راهنما کمک می‌کند؛ اما ضروری محسوب نمی‌شوند.

دقت کنید که در ادامه مقدمه نسبتاً طولانی در مورد مفاهیم ابتدایی شی‌ءها ارائه شده است. اگر علاقه‌ای به خواندن این بخش ندارید، می‌توانید با کلیک روی این لینک (+) به بخش متدها مراجعه کنید.

مفاهیم ابتدایی شیءها

شیء مجموعه‌ای از داده‌ها و/یا کارکردهای مرتبط است که معمولاً شامل چند متغیر و تابع هستند. این متغیرها و تابع‌ها وقتی داخل شیء هستند، مشخصات و متدها نامیده می‌شوند.

اشیاء در جاوا اسکریپت همانند شیءهای دنیای واقعی هستند. آن‌ها مشخصاتی دارند، در برخی موارد می‌توانند کاری انجام دهند و اغلب اوقات نیز شیءهای دیگری را بسط می‌دهند. برای نمونه یک سگ را تصور کنید.

شما یک سگ را چگونه توصیف می‌کنید؟ سگ چه مشخصاتی دارد؟ آیا سگ‌ها نوع تکامل‌یافته‌ای از گرگ هستند؟ به نحوی که بتوان گفت مشخصات گرگ‌ها را بسط داده‌اند. یک گرگ چه می‌تواند بکند؟ گرگ چه مشخصاتی دارد؟

نمونه‌ای از شبه سگ/گرگ

// گرگ
// - مشخصات
// -- رنگ مو
// -- رنگ چشم
// -- اندازه
// -- جنسیت
// -- سن
// - اعمال
// -- راه رفتن/دویدن
// -- خوردن
// -- خوابیدن
// سگ بسط یافته از گرگ
// - مشخصات
// -- نام گونه
// - اعمال
// -- ادرار روی شیر آتش‌نشانی—

در این مثال یک گرگ بسیار ساده و سگ را مدل‌سازی کرده‌ایم. رنگ مو، اندازه، سن، و مواردی از این دست دارد و می‌تواند بدود، بخورد و بخوابد. سگ نوعی از گرگ است که برخی مشخصات و اعمال اضافی دارد.

در واقع هر چیزی که گرگ دارد، سگ هم دارد و صاحب یک نام ویژه مانند پودل (poodle) است. سگ می‌تواند کارهای بیشتری بکند، مثلاً به آغوش بیاید و یا روی شیر آتش‌نشانی ادرار کند. حتی می‌توان از این هم دقیق‌تر آن را بررسی کرد و به خصوصیات رفتاری گونه‌های خاصی از سگ وارد شد. برای نمونه سگ امداد، گونه تکامل‌یافته‌ای از سگ است که یک عمل اضافی یعنی عملیات امداد و نجات را انجام می‌دهد.

ایجاد شیء اولیه

چندین روش برای ایجاد شیءها وجود دارند. ساده‌ترین روش استفاده از شیء مکتوب است، یعنی محتوای یک شیء را بنویسیم. البته در ادامه روش‌های پیشرفته‌تری برای ایجاد شیء معرفی خواهیم کرد.

دقت کنید که تابع greet در کد فوق یکی از ویژگی‌های ES6 است. به جای آن می‌توان کلیدی به صورت نرمال تعریف کرد و به آن مقدار یک تابع را داد یا این که ارجاعی به تابع داد یا از یک تابع درون‌خطی (inline) مانند greet: function() {} یا greet: greetFunc استفاده کرد.

روش‌های تعریف شیء

  • خصوصیت/کلید: درون هر شیء به طور معمول متغیرهایی وجود دارند. این متغیرها نام‌هایی دارند که از آن برای دسترسی به مقدار متغیر استفاده می‌کنیم مثلاً name: ‘jeff’
  • متد: متدها تابع‌هایی هستند که درون یک شیء قرار دارند و در اغلب موارد از مشخصات شیء استفاده می‌کنند.

this چیست؟

در جاوا اسکریپت چیزی به نام this داریم. this شاید بخشی از جاوا اسکریپت است که موجب بیشترین سردرگمی می‌شود.

this متغیری است که هنگام ایجاد محتوای اجرایی از سوی جاوا اسکریپت تولید می‌شود و به یک شیء اشاره دارد. این که this به چه شیئی اشاره دارد، بستگی به این دارد که تابع چگونه فراخوانی شده است.

چارچوب اجرایی (Execution Context)  – زمانی که یک تابع فراخوانی می‌شود، یک چارچوب اجرایی ایجاد می‌شود. این چارچوب متغیرهای تابع، this و ارجاع به محیط بیرونی را در خود نگهداری می‌کند.

this به چه چیزی اشاره دارد؟

می‌دانیم که this شیئی است که از سوی جاوا اسکریپت هنگام اجرای تابع به ما داده می‌شود. اما از کجا بدانیم this به چه چیزی اشاره می‌کند؟ این مسئله به شیوه فراخوانی this وابسته است. در ادامه بیشتر توضیح می‌دهیم.

قواعد زیر بر حسب تقدم هستند:

1. اتصال new

اگر تابع با استفاده از کلید new فراخوانی شده باشد در این صورت this به شیء جدیداً ایجاد شده اشاره می‌کند.

2. اتصال صریح

اتصال صریح: در این حالت this با استفاده از call، apply یا bind انتساب می‌یابد.

3. اتصال ضمنی

اگر تابع با یک شیء داخلش فراخوانی شود در این صورت this به آن شیء اشاره دارد، مانند person.greet

دقت کنید که این تابع لازم نیست حتماً به صورت صریح داخل شیء باشد. بلکه می‌تواند ارجاعی به تابع باشد مانند greet: greetFunc. آنچه که مهم است این است که فراخوانی تابع به صوت ارجاع به شیء صورت گرفته باشد.

4. this پیش‌فرض

به طور پیش‌فرض this به شیء گلوبال اشاره دارد. اگر strict mod فعال شده باشد، این this مقدار تعریف نشده (undefined) خواهد داشت.

تابع‌های Arrow

قواعدی که در بخش فوق اشاره کردیم در مورد تابع‌های Arrow صدق نمی‌کنند. تابع‌های Arrow از this حاصل از تابع تعریف شده در آن، یا مقدار پیش‌فرض گلوبال استفاده می‌کنند.

این‌ها قواعدی بودند که باید در مورد کاربرد this در جاوا اسکریپت در ذهن خود داشته باشید.

نمونه‌های اولیه (Prototypes)

نمونه‌های اولیه یا پروتوتایپ‌ها روشی برای افزودن متدها به اشیا هستند. این روش زمانی استفاده می‌شود که تنها یک متد در حافظه وجود داشته باشد.

  • وراثت – زمانی که یک شیء متدها و مشخصات خود را با شیء دیگری به اشتراک می‌گذارد، این حالت وراثت نامیده می‌شود.
  • وراثت کلاسیک – این نوع از وراثت را در زبان‌های برنامه‌نویسی مانند c، جاوا و غیره می‌توان مشاهده کرد.
  • وراثت پروتوتایپی – وقتی یک مشخصه را نتوان در یک شیء یافت، آن شیء در ساختار زنجیره مانند به نام پروتوتایپ جستجو می‌کند. اگر آن را در شیء پروتوتایپ بعدی نیابد به ترتیب پروتوتایپ‌های بعدی را می‌گردد.

برای مثال، وقتی یک آرایه دارید و از متدی مانند sort. استفاده می‌کنید که روی آرایه وجود ندارد. این متد روی پروتوتایپ قرار دارد.

در ادامه نمونه کد ساده‌ای از این وضعیت را ارائه کرده‌ایم:

در کد زیر نیز سازنده معمولی و پروتوتایپ‌ها مقایسه شده‌اند:

ساختار کلاس

کلاس مفهومی است که در زبان‌های برنامه‌نویسی شیءگرای دیگر نیز متداول است و جاوا اسکریپت نیز از همین مفهوم بهره می‌جوید. کلاس‌ها در جاوا اسکریپت مشابه زبان‌های دیگر هستند و مدل جدیدی ندارند. کلاس‌ها تنها نوع متفاوتی از پروتوتایپ‌ها هستند.

در ادامه بخش‌هایی از یک کلاس تعریف شده است:

  • تعریف کلاس (Class Definition ) – تعریف کلاس نشان دهنده روش معرفی کلاس است، یعنی کلاس از نوع سطح بالا است یا از کلاس دیگری بسط یافته است.
  • سازنده (Constructor ) – متدهای مقداردهی اولیه در هر وهله از کلاس است.
  • سوپر (Super) – از سوپر برای ارسال آرگومان‌ها به کلاس والد و استفاده از متدهای والد استفاده می‌شود.
  • متدهای استاتیک (Static Methods ) – متدهایی هستند که روی سازنده کلاس کار می‌کنند؛ اما روی وهله‌ها کاربردی ندارند.
  • متدهای وهله‌ای (Instance Methods) – متدهای دارای this که به وهله‌های خاصی از یک کلاس تعلق دارند.

شیوه نمایش عملی کلاس در کد با استفاده از مثال سگ به صورت زیر است:

نکات بنیادی مهم

موارد زیر نکات مهمی هستند که باید همواره به خاطر داشته باشید:

  • در جاوا اسکریپت هر چیزی که از نوع مقدماتی (PRIMITIVE) نباشد، یک شیء است.
  • روش‌های زیادی برای ایجاد شیء وجود دارد.
  • شیءها روشی برای توصیف اشیا یا داده‌های دارای مشخصات و متد هستند.
  • this در زمان اجرا تعیین می‌شود.
  • کلاس‌ها تنها یک نوع متفاوت از ساختار هستند که موجب سهولت برنامه‌نویسی می‌شوند (Syntactic sugar)

متدهای رایج

در ادامه قطعه کدهایی ارائه شده است که کاربرد متدها را در برخی موقعیت‌ها به همراه توضیحاتی نشان می‌دهند. در اغلب موارد شما متدهای خاص خود را روی شیءها تعریف می‌کنید؛ اما چند متد استاتیک هستند که همواره مفید محسوب می‌شوند. این متدها و تکنیک‌هایی برای کارهای خاصی مانند تعریف حلقه روی یک شیء در ادامه آمده است.

Getter ها و Setter ها

ما می‌توانیم از Getter و Setter برای کنترل دسترسی به شیء استفاده کنیم.

استفاده از آرایه کلید-جفت در شیء

غیر قابل تغییر (Immutable) ساختن یک شیء

می‌توان از ()Object.freeze برای غیر قابل تغییر ساختن یک شیء استفاده کرد.

کیفیت یک شیء فریز شده به صورت زیر است:

  • مشخصات جدیدی نمی‌توان اضافه کرد.
  • مشخصات موجود را نمی‌توان حذف کرد.
  • مقادیر مشخصات را نمی‌توان تغییر داد.
  • پروتوتایپ را نمی‌توان تغییر داد.

کپی سطحی (Shallow) از یک شیء

کپی کردن به صورت سطحی به معنی کپی کردن مقادیر است، به صورتی که ارجاع تغییری نیابد. یعنی شیء جدید کپی شده کماکان به همان شیء اولیه اشاره می‌کند.

کپی عمیق (Deep) یک شیء

کپی عمیق باعث می‌شود که کل یک شیء بدون هیچ ارجاعی به شیء قبلی در محل جدیدی کپی شود.

تبدیل شیء به JSON

کد زیر روش تبدیل یک شیء به قالب JSON را نشان می‌دهد.

تعریف حلقه روی شیء

کد زیر روش تعریف حلقه روی یک شیء را نشان می‌دهد:

بررسی وجود یک کلید در شیء

قطعه کد زیر روش بررسی وجود داشتن یک کلید خاص درون یک شیء را نشان می‌دهد:

سخن پایانی

بدین ترتیب با مفاهیم و متدهای شیءها در جاوا اسکریپت آشنا شدیم. البته این‌ها همه موارد مرتبط با شیء نیستند و بدین منظور باید منتظر مطالب دیگر ما باشید. اما این مقاله نقطه شروع مناسبی برای درک مفهوم شیء و شیءگرایی در جاوا اسکریپت محسوب می‌شود.

اگر این مطلب برایتان مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

آیا این مطلب برای شما مفید بود؟

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *