| معدل الوصول | مكان إمكانية الوصول | الشرح والاستخدام العملي |
|---|---|---|
| public | في كل مكان (داخل الفئة، الفئات الفرعية، وخارجها) | الوضع الافتراضي لأي خاصية أو دالة، حيث يمكن قراءتها وتعديلها بحرية تامة من أي مكان |
| private | داخل الفئة المُعرفة فيها فقط | يمنع نهائياً الوصول للخاصية أو الدالة من خارج الفئة أو حتى من الفئات الابنة (الورثة) |
| protected | داخل الفئة وفروعها (الوراثة) فقط | يسمح للـ Classes الابنة بالوصول للخصائص مع إبقاءها مخفية عن العالم الخارجي ومنع تعديلها مباشرة |
بعد أن تعرفنا على مفهوم الفئات (Classes) في الدرس السابق، يأتي الدور على ضبط صلاحيات الوصول لخصائص ودوال هذه الفئات في إطار عمل Angular 22.1. توفر لنا لغة TypeScript أدوات قوية تُعرف بـ معدلات الوصول (Access Modifiers) وهي (public, private, protected)، والتي تمكننا من تطبيق مبدأ تغليف البيانات (Encapsulation) وحماية الحالة الداخلية للكائنات ومنع التلاعب الخارجي بها.
هو الوضع الافتراضي في TypeScript. عندما لا تكتب أي معدل وصول قبل الخاصية أو الدالة، فإنها تعتبر public، مما يعني إمكانية استدعائها من أي مكان في تطبيق Angular (سواء من داخل المكون أو من قوالب الـ HTML الخاصة به).
الـ private يحمي البيانات الحساسة أو الحالات الداخلية (مثل حالة الاتصال بالخادم أو الـ Tokens) بحيث لا يمكن لأي كائن أو مكون خارجي رؤيتها أو تعديلها. الـ protected مفيد جداً عند استخدام الوراثة (inheritance)، حيث تسمح للفئات الابنة بوراثة خصائص معينة دون السماح للمكونات الخارجية بالعبث بها.
هنا نقوم بإنشاء خدمة أو فئة تدير المصادقة مع حماية المتغيرات الحساسة:
| 1 | class AuthService { |
| 2 | // خاصية خاصة لا يمكن قراءتها أو تعديلها من خارج الفئة |
| 3 | private token: string = "xyz-secure-token-123"; |
| 4 | |
| 5 | // دالة عامة يمكن للمكونات استدعاؤها بأمان |
| 6 | public authenticate(password: string): boolean { |
| 7 | if (password === "12345") { |
| 8 | this.logAccess(); // استخدام دالة خاصة داخلية |
| 9 | return true; |
| 10 | } |
| 11 | return false; |
| 12 | } |
| 13 | |
| 14 | private logAccess(): void { |
| 15 | console.log("تم تسجيل دخول ناجح وتوليد الجلسة بأمان."); |
| 16 | } |
| 17 | } |
في هذا المثال، نسمح للفئات الابنة بالوصول إلى خصائص الأب مع منع الوصول الخارجي تماماً:
| 1 | class BaseComponent { |
| 2 | // خاصية محمية يمكن للفئات الابنة استخدامها مباشرة |
| 3 | protected isLoading: boolean = false; |
| 4 | |
| 5 | protected showLoader(): void { |
| 6 | this.isLoading = true; |
| 7 | } |
| 8 | } |
| 9 | |
| 10 | class UserDashboardComponent extends BaseComponent { |
| 11 | loadData(): void { |
| 12 | this.showLoader(); // مسموح لأن الدالة protected والابن يرث الأب |
| 13 | console.log(`حالة التحميل الحالية: ${this.isLoading}`); |
| 14 | } |
| 15 | } |
| 16 | |
| 17 | let dashboard = new UserDashboardComponent(); |
| 18 | dashboard.loadData(); |
| 19 | // dashboard.isLoading; // خطأ برمجي: لا يمكن الوصول لخاصية محمية من الخارج |