سلام به شما دوستان.
خیلیا به آبجکت ها به چشم یک دیتا تایپ ساده که فقط میشه بهشون پراپرتی اضافه کرد، پراپرتی حذف کرد و ادیت کرد نگاه میکنن. ولی آبجکت ها خیلی بیشتر از این ها هستن و ویژگی های جالبی دارن. یکی از این ویژگی های جالب و خفن که شاید خیلیا ازش اطلاع ندارن، ویژگی کانفیگ کردن پراپرتی های آبجکت هست. بله! پراپرتی های آبجکت ها کانفیگ دیفالت دارن و شما میتونید اونجوری که دوست دارید این کانفیگ ها رو تغییر بدید! در ادامه نحوه انجام این کار رو بهتون میگم. امیدوارم از این مقاله لذت ببرید و کلی چیز یاد بگیرید.
متد defineProperty از کلاس Object، پراپرتی ای رو با کانفیگی که شما مشخص میکنید به آبجکت مورد نظرتون اضافه میکنه.
این متد سه تا آرگیومنت میگیره. این آرگیومنت ها به ترتیب عبارتند از: آبجکت مورد نظر شما که میخواید پراپرتی بهش اضافه کنید - اسم پراپرتی مورد نظرتون که میخواید اضافه کنید به آبجکت - آبجکتی که دارای کانفیگ های مورد نظر شما برای اون پراپرتی هست
ما بیشتر با پراپرتی های آبجکت کانفیگ این متد کار داریم. آبجکت کانفیگ این متد میتونه پراپرتی های زیر رو بگیره(تایپ هایی که هر پراپرتی باید بگیره جلوی : هست )
{ value: any, cnfigurable: boolean | undefined, writable: boolean | undefined, enumerable: boolean | undefined, get: () => any, set: (data) => void }
توضیحات هر کانفیگ:
value:
این پراپرتی برای اینه که شما مقدار دیفالت پراپرتی ای که میخواید به آبجکت اضافه کنید رو مشخص کنید.
configurable:
اگر این پراپرتی مقدارش true باشه، شما نمیتونید اون پراپرتی ای که به آبجکت اضافه شده رو از آبجکت حذف کنید یا اون رو ادیت کنید. اگر false باشه اون پراپرتی این ویژگی ها رو نداره.
writable:
این پراپرتی اگر مقدارش true باشه، شما میتونید مقدار جدید با استفاده از عملگر انتساب( = ) بریزید توی اون پراپرتی ای که میخواید به آبجکت اضافه کنید. اگر مقدارش false باشه، اون پراپرتی رو نمیشه ادیت کرد.
enumerable:
این پراپرتی اگر مقدارش true باشه، اون پراپرتی برای حلقه هایی مثل forin معلوم میشه و همچنین اون پراپرتی توی آرایه ای از پراپرتی ها که Object.keys بر میگردونه وجود خواهد داشت. ولی اگر مقدارش false باشه، اون پراپرتی انگار جزوی از اون آبجکت نمیشه(مثال هست) و توی حلقه ای مثل forin و آرایه پراپرتی های اون آبجکت وجود نخواهد داشت. مقدار دیفالت این کانفیگ false هست.
get:
این پراپرتی همون فانکشن getter خودمون توی آبجکت ها و کلاس ها هست. این فانکشن حتما یه مقداری باید برگردونه.
set:
این پراپرتی هم همون فانکشن setter خودمون توی آبجکت ها و کلاس ها هست. این فانکشن حتما باید یه آرگیومنت بگیره.
نکته 1: شما اگر میخواید پراپرتی ای که میخواید به آبجکتی اضافه کنید غیر قابل حذف باشه و همچنین بتونید مقدارش رو ادیت کنید، باید configurable و writable رو true کنید.
نکته 2: یک پراپرتی که از نوع getter یا setter هست، فقط میتونه کانفیگ های enumerable، configurable و set یا get رو بگیره. اگر شما غیر از این کانفیگ ها رو همزمان در کنار get یا set اضافه کردید، ارور میگیرید.
نکته 3: یک پراپرتی همزمان هم میتونه از نوع get باشه هم میتونه از نوع set باشه.
یک مثال از این متد:
let user = {}; Object.defineProperty(user, "name", { value: "John", enumerable: true });
حالا که معنا و مفهوم این کانفیگ ها رو فهمیدید، بریم یک مثال از این موارد ببینیم.
ما یک فانکشنی داریم که برای به دنیا اوردن یک فرد مناسب هست و یه جورایی شناسنامه فرد به دنیا اومده رو بهش میده.
این فانکشن مشخصات یک فرد که عبارتند از نام، نام خانوادگی، محل تولد، نام پدر، نام مادر و ملیت رو میگیره. به این شکل:
function born(name, lastName, birthPlace, fatherName, motherName, nationality) { }
حالا هر شخص یه کد ملی داره. برای جنریت کردن کد ملی یه فانکشن واسه جنریت کردن عدد رندوم بین دو تا عدد مینویسیم و بعد بین عدد 100000000 و 9999999999 عدد رندوم جنریت میکنیم.(کد ملی ده رقمی هست). به این شکل:
function generateRandomNumber(min, max) { return Math.floor(Math.random() * (max - min + 1) + min); } function born(name, lastName, birthPlace, fatherName, motherName, nationality) { const nationalCode = const nationalCode = generateRandomNumber(1000000000, 9999999999); }
حالا باید ویژگی های هر فرد رو ببینیم چجوریه.
یک فرد میتونه اسم و اسم فامیلیشو عوض کنه، ولی نمیتونه اون ها رو حذف کنه. همچنین پدر و مادر یک فرد هم میتونن اسمشون رو تغییر بدن ولی نمیتونن اسمشون رو حذف کنن. ملیت یک فرد، کد ملی یک فرد و محل تولد یک فرد غیر قابل تغییر و غیر قابل حذف هستن. محل تولد یک فرد هم برای یک کشور خارجی مهم نیست. سن یک فرد قابل تغییر هست ولی غیر قابل حذف هست. همچنین ما یک ویژگی برای دریافت کل اطلاعات شناسنامه و تغییر اطلاعات شناسنامه قرار میدیم.
حالا بریم سراغ ساخت شناسنامه.
چون پراپرتی های شناسنامه زیاد هستن، ما میایم از متد Object.defineProperties استفاده برای کانفیگ پراپرتی هامون. این متد برای تعریف گروهی از پراپرتی ها در یک آبجکت هست. این متد دو تا آرگیومنت میگیره. آرگیومنت اول آبجکت تارگت هست و آرگیومنت دوم آبجکتی از پراپرتی ها هست که میخوایم به آبجکت تارگت اضافه بشن. مقدار هر پراپرتی توی آبجکت پراپرتی ها، یک آبجکت هست که شما میتونید کانفیگ های مورد نظرتون برای اون پراپرتی رو توی آبجکتی که انتساب میدید به اون پراپرتی بنویسید. مثال:
const object1 = {}; Object.defineProperties(object1, { property1: { //کانفیگ ها value: 42, writable: true }, property2: {} });
حالا ما پراپرتی های آبجکت person رو به این صورت کانفیگ میکنیم و ریترن میکنیم:
function born(name, lastName, birthPlace, fatherName, motherName, nationality) { const nationalCode = generateRandomNumber(1000000000, 9999999999); const age = 0; const person = {}; Object.defineProperties(person, { name: { value: name, configurable: false, writable: true, enumerable: true, }, lastName: { value: lastName, configurable: false, writable: true, enumerable: true, }, birthPlace: { value: birthPlace, configurable: false, enumerable: false, }, fatherName: { value: fatherName, configurable: false, writable: true, enumerable: true }, motherName: { value: motherName, configurable: false, writable: true, enumerable: true, }, nationality: { value: nationality, configurable: false, enumerable: true, }, nationalCode: { value: nationalCode, configurable: false, enumerable: true, }, age: { value: age, configurable: false, writable: true, enumerable: true, }, getPrintedInfos: { get: function () { let infos = ``; for (const key in this) { infos += ` | ${key}: ${this[key]} | `; } return infos; }, configurable: false, enumerable: false, }, setInfo: { set: function (v) { const splitedV = v.split(","); this[splitedV[0]] = splitedV[1]; }, enumerable: false, configurable: false }, }); return person; }
خب این هم از شناسنامه.
این هم از این مقاله. امیدوارم کلی چیز یاد گرفته باشید و از این مقاله خوشتون اومده باشه.
اگه دوست داشتید لایک کنید مقاله مو. اگه دوست داشتید دنبال کنید من رو. اگه دوست داشتید یه کامنت مثبت و یا انتقاد منطقی بزارید واسم. خلاصه هرکاری دوست داشتید توی زندگیتون انجام بدید؛ هرکاری که به کسی آسیب نزنه و یا غمگینش نکنه :)