مقدمه

مدیریت سطح دسترسی به متدها و پراپرتی‌ها در کلاس‌های جاوااسکریپت از اصول کلیدی برنامه‌نویسی شی‌گرا است. با خصوصی‌سازی (private) و حفاظت (protected) می‌توانید از دسترسی ناخواسته و تغییرات اشتباه جلوگیری کنید و کدهای ایمن‌تر و حرفه‌ای‌تر بنویسید. اینها مواردی هستند که به یکی دیگر از اصول کلیدی شی‌گرایی با نام Encapsulation یا کپسوله‌سازی مربوط می‌شوند. کپسوله‌سازی نه تنها باعث امنیت داده می‌شود، بلکه توسعه و نگهداری کد را آسان‌تر می‌کند. این مفهوم کمک می‌کند تا پیاده‌سازی داخلی اشیا مخفی بماند و فقط اینترفیس‌ها یا رابط‌های لازم در اختیار کاربر یا دولوپر باشد.

تعریف پراپرتی و متد Private

برای تعریف پراپرتی یا متد خصوصی (private) در کلاس‌های مدرن جاوااسکریپت از پیشوند # استفاده می‌شود. این اعضا فقط از داخل همان کلاس قابل دسترسی هستند و حتی کلاس‌های فرزند یا نمونه‌ها نمی‌توانند به آن‌ها دسترسی پیدا کنند.

در مثال زیر، پراپرتی #balance و متد showBalance فقط از داخل کلاس BankAccount در دسترس هستند.

Copy Icon JAVASCRIPT
class BankAccount {
  #balance = 0;
  deposit(amount) {
    this.#balance += amount;
  }
  showBalance() {
    console.log(this.#balance);
  }
}
let acc = new BankAccount();
acc.deposit(100);
acc.showBalance(); // 100
// acc.#balance = 500;  Error: Private field

در اینجا اگر تلاش کنید مستقیماً به #balance از بیرون کلاس دسترسی پیدا کنید، با خطا مواجه می‌شوید. این ویژگی باعث می‌شود داده‌های حساس فقط از طریق متدهای تعریف‌شده در کلاس قابل تغییر باشند و امنیت بیشتری فراهم شود.

متدهای private نیز مانند پراپرتی‌ها با # تعریف می‌شوند و فقط از داخل همان کلاس قابل استفاده‌اند. مثال زیر را ببینید.

Copy Icon JAVASCRIPT
class Logger {
  #log(msg) {
    console.log("LOG:", msg);
  }
  doLog() {
    this.#log("Hello");
  }
}

let l = new Logger();
l.doLog(); // LOG: Hello

در این مثال، متد #log فقط از داخل خود کلاس Logger قابل فراخوانی است و اگر تلاش کنید آن را از بیرون کلاس یا توسط نمونه صدا بزنید، با خطا مواجه خواهید شد. این ویژگی باعث می‌شود منطق داخلی کلاس از دسترسی مستقیم محافظت شود و فقط از طریق متدهای عمومی (public) مانند doLog قابل استفاده باشد.

تعریف پراپرتی و متد Protected

در جاوااسکریپت کلیدواژه protected وجود ندارد، اما قراردادی رایح است که برای اعضای protected از پیشوند زیرخط (_) استفاده شود. این پراپرتی‌ها و متدها واقعاً private نیستند اما نشان می‌دهند که دستکاری مستقیم آن‌ها توصیه نمی‌شود و معمولاً فقط برای کلاس و فرزندانش مناسب هستند.

در مثال زیر، مقدار _salary به عنوان protected در نظر گرفته می‌شود و کلاس فرزند به آن دسترسی دارد.

Copy Icon JAVASCRIPT
class Employee {
  _salary;
  constructor(salary) {
    this._salary = salary;
  }
}

class Manager extends Employee {
  increaseSalary() {
    this._salary += 1000;
  }
}

let m = new Manager(5000);
m.increaseSalary();
console.log(m._salary); // 6000 (ولی توصیه نمی‌شود مستقیماً دستکاری شود)

در اینجا اگرچه پراپرتی _salary به صورت protected تعریف نشده و همچنان از بیرون کلاس قابل دسترسی است، اما با قراردادن پیشوند زیرخط (_) به توسعه‌دهندگان هشدار داده می‌شود که این عضو فقط برای استفاده داخلی کلاس و فرزندان آن در نظر گرفته شده و نباید مستقیماً تغییر داده شود. این یک قرارداد رایج در جامعه جاوااسکریپت است و رعایت آن به خوانایی و نگهداری بهتر کد کمک می‌کند.

تعریف صحیح پراپرتی و متدهای private و protected، پایه‌ای برای کپسوله‌سازی و امنیت ساختار داده‌ها در برنامه‌نویسی شی‌گرا است. این کار باعث پایداری بیشتر، قابل نگهداری بودن و جلوگیری از خطاهای ناخواسته می‌شود.

هرگاه نیازی به مخفی کردن داده‌ها یا توابع داخلی داشتید، از private (#) استفاده کنید و برای قراردادی کردن protected از پیشوند _ بهره بگیرید تا توسعه‌دهندگان دیگر پیام شما را درک کنند.