public / private / protected محددات الوصول و readonly
آخر تحديث: 2026-10-22
public / private / protected محددات الوصول و readonly
تتحكم محددات الوصول في ظهور الأعضاء: public (الافتراضي، متاح داخليًا وخارجيًا) وprivate (داخل الفئة فقط) وprotected (داخل الفئة والفئات الفرعية). وهي قيود خاصة بوقت الترجمة — فأخطاء التغليف تظهر أثناء كتابة الكود، لا بعد فساد البيانات في وقت التشغيل.
| المجموعة | الدوال والأصناف |
|---|---|
| النوع | بناء الجملة |
| الوضع الصارم | غير مطلوب |
ℹ️ معلومة يحوّل المحرر لغة TypeScript إلى JavaScript ثم يشغّلها (بدون فحص أنواع)؛ راجع ناتج كل مثال لنتيجة فحص الأنواع.
📝 الصيغة
class BankAccount {
public owner: string; // public هو الافتراضي، وكتابته صريحة للتعبير عن النية
private balance: number; // للقراءة والكتابة من داخل الكلاس فقط
constructor(owner: string, initial: number) {
this.owner = owner;
this.balance = initial;
}
deposit(amount: number): void { this.balance += amount; }
getBalance(): number { return this.balance; }
}
⚙️ المعاملات
| public | المحدد الافتراضي: متاح في أي مكان؛ وكتابته صراحةً يساعد على توثيق نية التصميم |
|---|---|
| private | متاح فقط داخل طرق الفئة نفسها؛ والوصول إليه من الخارج أو من الفئات الفرعية خطأ ترجمة |
| protected | متاح للفئة والفئات الفرعية دون الخارج — «نقطة توسعة مُتحكَّم فيها» مخصصة للفئات الفرعية |
القيمة المُعادة:لا تغيّر المحددات أنواع إرجاع الطرق، بل تقيّد فقط «من يمكنه الاستدعاء والقراءة/الكتابة».
▶ مثال
عدّل الكود أدناه واضغط «جرّب» لرؤية نتيجة التحويل:
الناتج:
Mia: 150
(مخرجات التشغيل بعد التحويل؛ التعديل المباشر لـ acct.balance من الخارج سيعطي خطأ ترجمة — لا يمكن تغييره إلا عبر الطرق داخل الفئة)
💡 نقاط مهمة
ℹ️ معلومة private/protected خاصيتان في وقت الترجمة فقط: فالحقل يظل موجودًا على الكائن بعد التحويل (acct.balance يعمل في وقت التشغيل). وللعزل في وقت التشغيل استخدم الحقل الخاص في JS: #balance.
ℹ️ معلومة يمكن لنسخ الفئة نفسها أن تصل بعضها إلى الأعضاء الخاصة (مثل قراءة other.balance داخل equals(other: BankAccount))، وهذا بحسب التصميم ولا يُعد انتهاكًا.
⚠️ تنبيه يفقد private فاعليته بعد التحويل، فلا تجعل «الأمان» معلقًا عليه؛ فهو يمنع سوء الاستخدام غير المقصود لا الوصول الخبيث.
🏷️ الدوال والأصناف ذات صلة
💡 حالات ذات صلة
المزيد من الحالات قادم قريبًا.
📚 دروس ذات صلة
❓ أسئلة شائعة
س ما الفرق بين private وحقول # الخاصة؟
ج private فحص خاص بوقت ترجمة TS (يمكن تجاوزه في وقت التشغيل)؛ أما #field فخصوصية على مستوى لغة JS (لا يمكن الوصول إليها فعلًا في وقت التشغيل). في الكود الجديد يُفضَّل # أولًا، وفي السيناريوهات التي تحتاج تكاملًا عميقًا مع نظام أنواع TS استخدم private.
س متى تُستخدم protected؟
ج لتخصيص «نقاط توسعة متحكم فيها» للفئات الفرعية: طرق الخطاف في الفئة الأم وفق نمط الطريقة القالبية (template method)، والحالة الداخلية التي تحتاج الفئات الفرعية إلى قراءتها. أضيق من public وأوسع من private.
س كيف تختار بين getter/setter وحقول public؟
ج استخدم get/set عندما تحتاج القراءة/الكتابة إلى آثار جانبية (تحقق، تخزين مؤقت، قيم مشتقة)؛ أما التخزين البسيط للبيانات فيبقى حقلاً من نوع public — ولا تغلف كل حقل بأدوات وصول.