متدهای ()color.getRed و ()color.setRed به ما اجازه میدهند مقدار قرمز یک رنگ را بخوانیم یا تغییر دهیم. اگر از زبانهایی مثل جاوا (Java) آمده باشید، با این الگو کاملاً آشنا هستید. با این حال، استفاده از متدهای معمولی صرفاً برای دسترسی به یک ویژگی، در جاوااسکریپت کمی غیراقتصادی و غیراِرگونومیک است. Accessor fields به ما این امکان را میدهند که با یک عنصر دقیقاً به گونهای رفتار کنیم که انگار یک «ویژگی واقعی» است.
class Color {
constructor(r, g, b) {
this.values = [r, g, b];
}
get red() {
return this.values[0];
}
set red(value) {
this.values[0] = value;
}
}
const red = new Color(255, 0, 0);
red.red = 0; // شبیه به یک ویژگی معمولی مقداردهی میشود
console.log(red.red); // خروجی: 0
در ظاهر به نظر میرسد که این Object ویژگیای به نام red دارد؛ اما در واقعیت چنین Property خاصی روی این نمونه (Instance) وجود ندارد! اینجا فقط دو متد وجود دارند که با پیشوندهای get و set مشخص شدهاند و همین موضوع اجازه میدهد تا کدهای شما مانند یک ویژگی معمولی با آنها رفتار کنند.
اگر یک فیلد فقط دارای getter باشد و هیچ متد setter برای آن تعریف نشده باشد، آن ویژگی عملاً فقطخواندنی (Read-only) خواهد بود:
class Color {
constructor(r, g, b) {
this.values = [r, g, b];
}
get red() {
return this.values[0];
}
}
const red = new Color(255, 0, 0);
red.red = 0;
console.log(red.red); // خروجی: 255
در حالت سختگیرانه (Strict mode)، خط red.red = 0 منجر به پرتاب یک خطای تایپی خواهد شد: Cannot set property red of #<Color> which has only a getter. اما در حالت معمولی (Non-strict mode)، این مقداردهی بدون هیچ خطایی صرفاً نادیده گرفته میشود.
فیلدهای خصوصی، همتایان عمومی خود را نیز دارند که به هر اینستنس اجازه میدهند یک ویژگی مشخص را درون خود داشته باشد. فیلدها معمولاً به گونهای طراحی میشوند که مقادیر آنها مستقل از پارامترهای ورودیِ متد سازنده (constructor) باشد:
class MyClass {
luckyNumber = Math.random();
}
console.log(new MyClass().luckyNumber); // مثلاً: 0.5
console.log(new MyClass().luckyNumber); // مثلاً: 0.3
تعریف فیلدهای عمومی (Public fields) تقریباً معادلِ اختصاص دادن یک ویژگی به کلمه کلیدی this در داخل متد سازنده است. به عنوان مثال، کد بالا را میتوان به این شکل نیز بازنویسی کرد:
class MyClass {
constructor() {
this.luckyNumber = Math.random();
}
}
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://developer.mozilla.org/en-US/docs/Web/JavaScript