اذهب إلى المحتوى

السؤال

Recommended Posts

  • 0
نشر

السلام عليكم ورحمة الله وبركاته،

في JavaScript سابقا كانت لا توجد خاصيات وصول مثل private و public و protected كما في Java أو PHP.

وجميع الخصائص والدوال في الكائنات تكون قابلة للوصول من الخارج افتراضيا لكن مع ES202 تم إدخال الحقول الخاصة (Private Fields) باستخدام الرمز # قبل اسم الخاصية مثلا نكتب:

#privateProperty

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

  • 0
نشر

نعم في JavaScript يوجد مفهوم مشابه للخصائص مثل private و public و لكن تطبيقه وطريقة التنفيذ تختلف كثيرا عن اللغات الأخرى مثل Java و PHP وغيرها.

قبل ES2022 لم يكن هناك أى إمكانية لجعل الخصائص للصنف خاصة (private) ولكن منذ ES2022 أصبحت JavaScript تدعمها .

class Person {
    #name; // private

    constructor(name) {
        this.#name = name;
    }

    getName() {
        return this.#name;
    }
}

const p = new Person("Ali");
console.log(p.getName());
console.log(p.#name);

لاحظ في المثال السابق لجعل الخاصية private نقوم بوضع علامة # قبلها مما يسمح لنا بإخفائها.

وستجد أن أخر سطر في يعطيك رسالة خطأ أن #name هو  private.

أما protected فليست مدعومة حتى الآن.

  • 0
نشر

في JavaScript الوضع مختلف تماما عن Java وPHP ففي JavaScript التقليدي جميع الخصائص والدوال تكون public أي أنها عامة بشكل افتراضي بمعنى أنه يمكن الوصول إليها وتعديلها من أي مكان في الكود فلا نجد مثلا كلمات مفتاحية مثل private أو protected كما في اللغات الأخرى.

هنا المطورون كانوا يستخدمون اتفاقيات تسمية مثل البدء بشرطة سفلية _property للإشارة إلى أن الخاصية خاصة مثلا لاحظ هنا:

class Person {
    constructor(name, age) {
        this.name = name;
        this._age = age;
    }
}

const person = new Person("أحمد", 25);
console.log(person.name);
console.log(person._age);
person._age = 30;

هنا مع ES2022، تم إدخال الحقول الخاصة الحقيقية باستخدام الرمز # قبل اسم الخاصية، والتي تجعل الخاصية غير قابلة للوصول تماما من خارج الكلاس وهذا أقرب شيء ل private في اللغات الأخرى، لكن لا يوجد ما يعادل protected.

class PersonModern {
    #privateAge;
    
    constructor(name, age) {
        this.name = name;
        this.#privateAge = age;
    }
    
    getAge() {
        return this.#privateAge;
    }
}

const person2 = new PersonModern("سارة", 28);
console.log(person2.name);
console.log(person2.getAge());
  • 0
نشر

الأمر مختلف بالنسبة لجافاسكريبت، في الإصدارات القديمة للغة، جميع الخصائص والميثودز في كائن JavaScript تكون عامة public، وتستطيع الوصول إليها وتعديلها من أي مكان.

وكان يوجد محاكاة لمبدأ التغليف، أي private، وذلك بوضع شرطة سفلية _ كبادئة لاسم الخاصية أو الميثود للإشارة إلى أنها خاصة، وذلك مجرد اصطلاح ولا يمنع الوصول الفعلي، الفكرة لتنبيه المبرمجين الآخرين إلى أن تلك الخواص والميثودز لا ينبغي استخدامها مباشرة من خارج الكائن.

لكن يوجد طريقة أخرى من خلال الـ Closures  لإنشاء متغيرات وتوابع خاصة حقًا لا يمكن الوصول إليها من خارج الدالة أو الوحدة  التي أُنشئت فيها. 

وصدرت تحديثات في الإصدار ECMAScript 2022 وما بعده حيث أصبح يوجد Private Class Fields أو حقول الكلاس الخاصة، وتم تقديم طريقة رسمية لتعريف حقول خاصة في الكلاسات باستخدام علامة الهاش # كبادئة.

class MyClass {
  #privateField = 10;
  publicField = 20;

  constructor() {
    console.log(this.#privateField);
  }

  #privateMethod() {
    console.log("This is a private method");
  }

  publicMethod() {
    this.#privateMethod();
    console.log("This is a public method accessing private field: " + this.#privateField);
  }
}

const instance = new MyClass();
console.log(instance.publicField);

instance.publicMethod();

أما بخصوص protected فلا لا يوجد مفهوم protected مباشر ومدمج في JavaScript كما هو الحال في Java أو PHP والذي يسمح بالوصول من الكلاس نفسه والكلاسات الفرعية أي السماح للكلاسات الفرعية بالوصول إلى أعضاء معينة من الكلاس الأب ولكن ليس من الخارج.

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

فالحقول الخاصة # تكون خاصة بالكلاس الذي عُرّفت فيه فقط ولا يمكن للكلاسات الفرعية الوصول إليها مباشرة.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...