یک Getter تابعی (Function) متصل به یک Property است که مقدار آن ویژگی مشخص را بازیابی میکند (میگیرد). یک Setter نیز تابعی متصل به یک Property است که مقدار آن ویژگی مشخص را تنظیم میکند (تغییر میدهد). این دو در کنار هم میتوانند به صورت غیرمستقیم نمایندهی مقدار یک Property در برنامه باشند.
گترها و سترها را میتوان به دو روش تعریف کرد:
تعریف مستقیم درون Object initializers (هنگام ساخت شیء).
اضافه کردن آنها بعداً به هر شیءِ موجود (Existing object).
درون ساختار کروشه (Object initializer)، گترها و سترها شبیه به متدهای معمولی تعریف میشوند، با این تفاوت که کلمات کلیدی get یا set به عنوان پیشوند قبل از نام آنها قرار میگیرد.
قانون مهم: متد
getterنباید هیچ پارامتری دریافت کند، در حالی که متدsetterباید دقیقاً یک پارامتر (همان مقدار جدیدی که قرار است تنظیم شود) دریافت کند.
به عنوان مثال:
const myObj = {
a: 7,
get b() {
return this.a + 1;
},
set c(x) {
this.a = x / 2;
},
};
console.log(myObj.a); // 7
console.log(myObj.b); // 8 -> مقدار از متد get b() برگشت داده میشود
myObj.c = 50; // متد set c(x) را صدا میزند
console.log(myObj.a); // 25
ویژگیهای شیء myObj در کد بالا به این صورت عمل میکنند:
myObj.a: یک عدد (Number) معمولی است.
myObj.b: یک getter است که مقدار myObj.a را به علاوه ۱ برمیگرداند.
myObj.c: یک setter است که مقدار myObj.a را برابر با نصفِ عددی که به myObj.c نسبت داده شده، تنظیم میکند.
Object.defineProperties()شما همچنین میتوانید گترها و سترها را در هر زمان پس از ساخته شدن یک Object، با استفاده از متد Object.defineProperties() به آن اضافه کنید.
پارامتر اول این متد، همان شیئی است که میخواهید Getter یا Setter را رویش تعریف کنید. پارامتر دوم، شیئی است که نامِ ویژگیهای آن همان نامِ گترها یا سترهاست، و مقادیر این ویژگیها خود اشیائی هستند که توابع Getter یا Setter را تعریف میکنند.
در ادامه مثالی را میبینید که دقیقاً همان گتر و ستر مثال قبل را به این روش پیادهسازی میکند:
const myObj = { a: 0 };
Object.defineProperties(myObj, {
b: {
get() {
return this.a + 1;
},
},
c: {
set(x) {
this.a = x / 2;
},
},
});
myObj.c = 10; // Setter اجرا میشود و مقدار 2 / 10 یعنی 5 را به ویژگی 'a' اختصاص میدهد
console.log(myObj.b); // Getter اجرا میشود و مقدار a + 1 یعنی 6 را تولید میکند
انتخاب بین این دو روش به سبک برنامهنویسی شما و وظیفهای که در دست دارید بستگی دارد:
اگر به تعریفِ اصلی شیء دسترسی دارید و میتوانید آن را تغییر دهید، احتمالاً ترجیح میدهید گترها و سترها را از طریق همان Object initializer (روش اول) بنویسید. این ساختار بسیار جمعوجورتر و طبیعیتر است.
اما اگر نیاز دارید گترها و سترها را بعداً به شیء اضافه کنید—مثلاً به این دلیل که آن شیء خاص را شما ننوشتهاید و از یک کتابخانه گرفتهاید—در این صورت روش دوم تنها راه ممکن برای شماست. روش دوم ماهیت داینامیک جاوااسکریپت را به خوبی نشان میدهد، اما میتواند خوانایی و درک کد را کمی دشوار کند.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://developer.mozilla.org/en-US/docs/Web/JavaScript