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

هل من الممكن عمل توابع خاصة private ومحمية protected في JavaScript؟

Emad Saif

السؤال

في لغات مثل PHP و ++C و Java يمكن عمل توابع خاصة private أو توابع محمية protected في أي صنف، حاول أن أقوم بعمل مثل هذه التوابع في جافاسكريبت JavaScript ولكن لم أنجح.

هل توجد طريقة لعمل مثل هذه التوابع في جافاسكريبت أم أن اللغة نفسها لا تدعم مثل هذه المميزات؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

نعم يمكنك ذلك بإضافة الرمز # أثناء تعريف الـ  properties والـ methods في الـ class : 

class Something {
  // Private properties إضافة
  #property;

  constructor(){
    this.#property = "test";
  }

  // Private methods إضافة
  #privateMethod() {
    return 'hello world';
  }

  getPrivateMessage() {
      return this.#property;
  }
}

const instance = new Something();
console.log(instance.property); //=> undefined
console.log(instance.privateMethod); //=> undefined
console.log(instance.getPrivateMessage()); //=> test
console.log(instance.#property); //=> Syntax error

لاحظ انه لا يمكن الوصول للكل من الـ private properties و الـ private methods إلا من داخل class.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

بالنسبة للخواص المحمية Protected يصطلح تسميتها بداية مع underscore _ و يمن حماية القيم من التعديل بتوفر دالة get فقط، و عدم وضع set ضمن تعريف الصنف.

  • حماية الخواص من قيم خاطئة
class Person {
  _age = 0;

  set setAge(value) {
    if (value < 0) {
      value = 0;
    }
    this._age = value;
  }

  get getAge() {
    return this._age;
  }

  constructor(age) {
    this._age = age;
  }

}

let p = new Person(100);

// تعديل العمر
coffeeMachine.waterAmount = -10; // _age يصبح  0, وليس -10

مثال آخر:

  • حماية الخواص من الإسناد بشكل تام (منع إسناد قيمة جديدة)
class Person {
  // ...

  constructor(value) {
    this._age = value;
  }

  get age() {
    return this._age;
  }

}

let p = new Person(100);

alert(`Age is: ${p.age} Year`); // Age is: 100

p.age = 25; // Error (no setter) لا يتم تطبيقها

console.log(p.age) // 100

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...