ساخت شیء و دسترسی به Propertyهای آن

مقدمه

تا اینجا با آرایه آشنا شدیم که برای نگه‌داری مجموعه‌ای ترتیبی از مقادیر استفاده می‌شود. اما گاهی داده‌ای که می‌خواهیم نگه‌داریم، ترتیبی نیست، بلکه مجموعه‌ای از ویژگی‌های نام‌دار است؛ مثلاً نام، سن و شهر یک شخص. برای این منظور از شیء (Object) استفاده می‌کنیم.

ساخت یک شیء

رایج‌ترین روش ساخت شیء، استفاده از علامت {} است که به آن Object Literal می‌گویند:

let user = {
  name: "علی",
  age: 25,
  isOnline: true
};

هر شیء از تعدادی Property تشکیل شده که هرکدام یک جفت کلید-مقدار (Key-Value) هستند. در مثال بالا، name، age و isOnline نام Property ها هستند و "علی"، 25 و true مقدار متناظر آن‌ها.

دسترسی به Property با نقطه (Dot Notation)

let user = { name: "علی", age: 25 };

console.log(user.name); // علی
console.log(user.age);  // 25

این رایج‌ترین و خواناترین روش دسترسی به Property هاست و در اغلب موارد ترجیح داده می‌شود.

دسترسی به Property با کروشه (Bracket Notation)

روش دیگر، استفاده از [] است:

دسترسی به Property با Bracket Notation
خروجی کنسول اینجا نمایش داده می‌شود...

تحلیل کد

تفاوت اصلی این دو روش این است که در Dot Notation، نام Property باید مستقیماً و به‌صورت ثابت نوشته شود؛ اما در Bracket Notation، می‌توان نام Property را به‌صورت یک رشته (یا حتی یک متغیر که مقدار آن رشته است) مشخص کرد. به همین دلیل، وقتی نام Property از قبل مشخص نیست و باید در زمان اجرا تعیین شود، Bracket Notation تنها گزینه است.

یک محدودیت مهم Dot Notation این است که نام Property باید یک شناسه‌ی معتبر جاوااسکریپت باشد (مثلاً نمی‌تواند با عدد شروع شود یا فاصله داشته باشد). برای Property هایی با نام غیرمعمول، Bracket Notation الزامی است:

let product = { "نام محصول": "لپ‌تاپ" };

console.log(product["نام محصول"]); // لپ‌تاپ
// console.log(product.نام محصول); // خطای Syntax

افزودن و تغییر Property

let user = { name: "علی" };

user.age = 25;          // افزودن Property جدید
user.name = "رضا";       // تغییر مقدار Property موجود

console.log(user); // { name: "رضا", age: 25 }

جاوااسکریپت نیازی به تعریف از پیش Property ها ندارد؛ می‌توان در هر زمان، Property جدیدی به یک شیء اضافه کرد یا مقدار Property موجود را تغییر داد.

حذف Property با delete

let user = { name: "علی", age: 25 };

delete user.age;

console.log(user); // { name: "علی" }

بررسی وجود یک Property

برای بررسی اینکه آیا یک Property در شیء وجود دارد یا نه، می‌توان از عملگر in استفاده کرد:

بررسی وجود Property با in
خروجی کنسول اینجا نمایش داده می‌شود...

تحلیل رفتار جاوااسکریپت

نکته‌ی مهم این است که user.email برای Property ای که وجود ندارد، خطا نمی‌دهد؛ فقط مقدار undefined برمی‌گرداند. عملگر in برای مواردی مفید است که می‌خواهیم تفاوت بین «Property وجود ندارد» و «Property وجود دارد اما مقدار آن undefined است» را دقیقاً تشخیص دهیم؛ چیزی که صرفاً بررسی user.email !== undefined نمی‌تواند تضمین کند.

Property با مقدار تابع (متد)

مقدار یک Property می‌تواند یک تابع هم باشد؛ در این حالت به آن متد (Method) می‌گویند:

let user = {
  name: "علی",
  greet: function () {
    console.log("سلام، من " + user.name + " هستم");
  }
};

user.greet(); // سلام، من علی هستم

جاوااسکریپت همچنین یک نحو کوتاه‌تر برای تعریف متد ارائه می‌دهد که در آن نیازی به نوشتن function نیست:

let user = {
  name: "علی",
  greet() {
    console.log("سلام، من " + user.name + " هستم");
  }
};

user.greet(); // سلام، من علی هستم

این دو روش از نظر عملکردی یکسان هستند؛ فقط نگارش دومی کوتاه‌تر است. جزئیات کامل نحوه‌ی رفتار this در داخل متدها (به‌جای استفاده‌ی مستقیم از نام متغیر user) در فصل مربوط به this و Binding به‌طور کامل بررسی می‌شود.

ارتباط با سایر مفاهیم

شیء یکی از پرکاربردترین Reference Types در جاوااسکریپت است؛ رفتار آن از نظر کپی شدن با ارجاع (نه مقدار)، دقیقاً همان چیزی است که در فصل انواع داده درباره‌ی Reference Types بررسی کردیم. در درس‌های بعدی همین فصل، با متدهای آماده‌ی Object و همچنین Destructuring و Spread در شیء آشنا می‌شویم.

جمع‌بندی

شیء مجموعه‌ای از Property های کلید-مقدار است که با {} ساخته می‌شود. دسترسی به Property ها از طریق Dot Notation یا Bracket Notation ممکن است؛ Bracket Notation برای نام‌های پویا یا غیرمعمول ضروری است. Property ها را می‌توان در هر زمان اضافه، تغییر یا با delete حذف کرد، و عملگر in برای بررسی دقیق وجود یک Property به کار می‌رود.