‫ Proxy پترن در JavaScript

‫ Proxy پترنتوضیحات اولیهسلام امروز اومدم که شما رو با یک دیزاین پترن دیگه آشنا کنم به ‫اسم Proxyشاید اسمش واستون عجیب باشه و بگید پروکسی؟ پروکسی مگه واسه رد شدن از فیلترینگ و این داستانا نبود؟برای این که بفهمید دقیقا منطق این دیزاین پترن چیه و منظورش رو خوب متوجه بشید اول باید بدونید که پروکسی هایی که استفاده میکنیم برای فیلترینگ چطوری کار میکننپروکسی ها چطوری کار میکنن؟پروکسی ها توی دنیای شبکه بین ما و لینکی که بهش درخواست میزنیم هستن و هر اطلاعاتی که ما میخواییم از لینک بگیریم یا اطلاعاتی رو که میخواییم اطلاعاتی رو ارسال کنیم به لینک رو ابتدا به پروکسی میدیم بعد پروکسی میره درخواستمون رو میده به اون لینک و اگه باز درخواستمون پاسخی داشت پاسخ درخواستمون برمیگرده به سمت پروکسیمون و پروکسی درخواستمون رو برمیگردونه به ماخیلی خلاصه بخوام بگم انگار ما با احمد قهریم و هر حرفی که میخواییم به احمد بگیم رو به رضا میگیم و رضا میره به احمد میگه و باز اگه احمد حرفی داشت با ما به رضا میگه تا رضا به ما برسونه پیامواگه بازم نفهمیدید که پروکسی ها چیکار میکنن عیبی نداره این عکس رو ببینید کامل متوجه میشید:کاری که پروکسی ها میکنن به روایت تصویرخوب حالا که فهمیدید پروکسی دقیقا چیکار میکنه بریم که بفهمیم دقیقا این پترن چیه.منطق کلی این پترن چیهمنطق کلی این پترن میگه که ما برای تعامل هایی که داریم با آبجکت ها باید از یک واسطه استفاده کنیم و توی اون واسطه یک سری کنترل رو انجام بدیم و بعد تغییرات رو به آبجکت اصلی انتقال بدیم یا اگه میخواستیم مقداری رو از آبجکت دریافت کنیم از آبجکت اصلیمون نگیریم و از آبجکت واسطه بگیریمچطوری باید یک واسطه ایجاد کنیم؟‫توی اکما اسکریپت 6 یک کلاس خیلی خوب اضافه شد به جاوااسکریپت به اسم Proxy که نحوه کار کردن باهاش این شکلیه :نحوه ساختن یک آبجکت واسطه در جاوااسکریپتاز این به بعد برای گرفتن کار کردن با آبجکت‫ person نباید با خود آبجکت person کاری انجام بدیم و فقط باید با آبجکت واسطه که personProxy هست کار کنیم.خوب این چه سودی داره واسمون؟‫عجله نکنید :) هنوز نگفتم چه جادو هایی میتونید با این آبجکت واسطه بکنید.‫کلاس Proxy ما تو ورودی ( آرگومان ) دومش یک آبجکت میگیره که همه اتفاقات خوب اینجا اتفاق میوفته :)ما توی آرگومان دوم کلاس‫ Proxy میتونیم یک آبجکت بسازیم و توش یک سری متد بنویسیم که هر کدومشون یک وظیفه داشته باشن و قبل از انجام شدن اون تعاملات روی آبجکت واسطمون وارد اون متد ها بشن تا بشه عملیات هایی رو مثلا زمان آپدیت کردن یک پراپرتی انجام دادمثلا بگیم هر زمان که میخواست پراپرتی ای از آبجکت واسطمون آپدیت بشه برسی کنیم و بگیم اگه مقدار جدیدش عدد بود فقط آبجکتمون اصلیمون آپدیت بشه و در غیر این صورت آبجکت اصلی هیچ تغییری نکنهخیلی خفنه نه؟ بریم پیاده سازیش کنیماین آبجکت کنترل کننده رو چطوری باید بنویسیم حالا؟ما توی آبجکت کنترل کنندمون متد های زیادی داریم که من قصد دارم دوتاشون رو توضیح بدم ولی همشون رو نمیشه تو این مقاله اورد ولی اگه کنجکاو بودید راجبشون اینجا رو بخونیدمتد get: زمانی اجرا میشه که ما میخواییم مقداری رو از آبجکت واسطه دریافت کنیممتد set: زمانی اجرا میشه که ما بخواییم مقدار یکی از پراپرتی های آبجکت واسطه رو تغییر بدیمبریم که یک مثال ببینیم حالاپیاده سازی متد های get و set برای آبجکت کنترل کنندهتوضیحات کد بالا:‫متد get : اگه پراپرتی ای داشت از آبجکت واسطه دریافت میشد این متد اجرا میشه و تو ورودی اول obj رو به عنوان ورودی میگیره که کل آبجکت person هست و تو ورودی دوم prop رو میگیره که اسم پراپرتی ای هست که گرفته شده و توی متد هم یک console.logگذاشتیم که چاپ میکنه متنی که لاین بعدیش بصورت کامنت وجود داره‫متد set : اگه پراپرتی ای داشت مقدارش آپدیت میشد این متد اجرا میشه و تو ورودی اول obj رو میگیره که کل آبجکت person هست و تو ورودی دوم prop رو میگیره که اسم پراپرتی ای هست که میخواد آپدیت بشه و تو ورودی سوم value رو میگیره که مقداری جدیدی هست که برای اون پراپرتی فرستادم و توی متد هم یک console.logگذاشتیم که چاپ میکنه چیزی که لاین بعدیش بصورت کامنت وجود داره بعد میاد مقدار آبجکتمون رو آپدیت میکنهنکته : اگر در‫ strict mode باشیم و در متد set خودمان false را ریترن کنیم به ارور میخوریم در نتیجه بهتر است اگر مشکلی وجود دارد false را ریترن کنیم و در غیر این صورت true را ریترن کنیماگه نتونستید نحوه ای که آبجکت واسطمون داره کار میکنه رو نفهمیدید گیف زیر رو ببینید تا کامل متوجه شید چه اتفاقی داره میوفتهنحوه کار کردن این دو متددر واقع ما با آبجکت ‫person هیچ کاری نداشتیم اما personProxy ما داره خودش با آبجکت ‫person ارتباط برقرار میکنهبیایید ‫بهتر proxy هارو بنویسیم!‫تو متد های set و get ای که توی آبجکت کنترل کنندمون داشتیم دیدید که ما برای دسترسی به آبجکت personداشتیم از آرگومان اول متد استفاده میکردیم و مقدار رو با همون از آبجکت person تغییر میدادیم یا میگرفتیمش اما راه حل ساده تر چیه؟اینه که به جای‫ نوشتن کد [prop]obj از یک چیز دیگه استفاده کنیم به اسم Reflect این آبجکت که بصورت گلوبال توی جاوااسکریپت تعریف شده یک سری ورودی از ما میگیره و این کار هارو خودش انجام میدهچطوری؟ بریم ببینیم!Reflect نحوه پیاده سازیپروکسی ها کجا به درد ما میخورن؟‫همونطور که مشخصه پروکسی ها به درد تایید سنجی (validation) خیلی میخورن یا وقتی میخواییم اطلاعات یک آبجکت رو آپدیت کنیم یه تغییری تو دیتای ورودی ایجاد کنیم میتونیم از پروکسی ها استفاده کنیممشکلات این دیزاین پترناین دیزاین پترن از اونجایی که برای هربار تعامل با آبجکت یکی از متد های کنترل کننده مارو اجرا میکنن به راحتی میتونن تو پرفورمنس ما تاثیر بدی بزارن و باعث بشن برنامه ما کند اجرا بشه‫ برای همون باید مواظب باشیم که کجا ازش استفاده کنیم.صحبت های پایانیممنونم از اینکه وقت با ارزشتون رو گذاشتید و مقاله من رو خوندید امیدوارم واستون مفید بوده باشه و چیزی به دانشتون اضافه کرده باشهاگه متنی که نوشتم ایرادی داشت یا فکر میکنید با عوض کردن قسمتیش قابل فهم تر میشه ممنون میشم تو کامنت ها به من اعلام کنیدمن برای نوشتن این متن ها اول این سایت میرم و منطق یک دیزاین پترن رو میخونم و بعد چیز هایی که فهمیدم رو برای شما مینویسم مثلا تو پست قبلی‫ راجب Singleton پترن توضیح دادم که میتونید رو لینک زیر کلیک کنید و بخونیدش https://virgool.io/@Mohammadizanloo55/js-singleton-pattern-gh6hokwxuvjj