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 — ولا تغلف كل حقل بأدوات وصول.
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%