الخاصيات والتوابع الخاصة والمحمية في جافاسكربت
تُعتبر جافاسكربت واحدة من اللغات الأساسية في عالم تطوير البرمجيات، إذ يتم استخدامها لبناء التطبيقات التفاعلية على الويب. كغيرها من اللغات البرمجية، توفر جافاسكربت مجموعة من الأدوات والتقنيات التي تمكن المطورين من بناء برامج قوية وفعالة. من بين هذه الأدوات، تُعتبر “الخاصيات والتوابع الخاصة والمحمية” واحدة من المفاهيم الأساسية التي يمكن أن تساعد المطورين في إدارة الوصول إلى الكائنات وبياناتها بطريقة أكثر أمانًا ومرونة.
1. ما هي الخاصيات والتوابع الخاصة والمحمية؟
في جافاسكربت، الكائنات (Objects) تعد بنية بيانات تحتوي على أزواج من المفاتيح والقيم، وتُستخدم لتخزين المعلومات وتنظيمها. بالإضافة إلى ذلك، يمكن للكائنات في جافاسكربت أن تحتوي على “توابع” (Functions) و”خاصيات” (Properties)، وهي في الغالب تمثل سلوك الكائن وخصائصه.
لكن في بعض الأحيان، يرغب المطورون في التحكم بكيفية الوصول إلى هذه الخاصيات والتوابع. ومن هنا، تأتي أهمية الخاصيات والمحمية في جافاسكربت. يمكن تصنيف هذه الخاصيات إلى ثلاثة أنواع رئيسية:
-
الخاصيات العامة: وهي الخاصيات التي يمكن الوصول إليها وتعديلها من قبل أي كود في البرنامج.
-
الخاصيات الخاصة: وهي الخاصيات التي تكون محمية بحيث لا يمكن الوصول إليها أو تعديلها مباشرة من الخارج.
-
الخاصيات المحمية: وهي الخاصيات التي يمكن الوصول إليها أو تعديلها فقط ضمن الكائنات أو الكائنات المشتقة منها.
2. الخاصيات والتوابع العامة (Public Properties and Methods)
في جافاسكربت، الخاصيات العامة هي تلك التي يمكن الوصول إليها وتعديلها من أي مكان في البرنامج. هذه الخاصيات تكون عادة جزءًا من واجهة الكائن أو فئة الكائنات. عندما يقوم المطور بتعريف خاصية داخل كائن، تكون هذه الخاصية عامة بشكل افتراضي، مما يعني أن أي كود في البرنامج يستطيع الوصول إليها أو تعديل قيمتها.
على سبيل المثال:
javascriptclass Person {
constructor(name, age) {
this.name = name; // خاصية عامة
this.age = age; // خاصية عامة
}
greet() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
}
}
let person1 = new Person('John', 30);
person1.greet(); // يمكن الوصول إلى التابع العام
console.log(person1.name); // يمكن الوصول إلى الخاصية العامة
في المثال السابق، name و age هما خاصيتان عامتان، ويمكن الوصول إليهما مباشرة باستخدام الكائن person1.
3. الخاصيات والتوابع الخاصة (Private Properties and Methods)
تعتبر الخاصيات والتوابع الخاصة من المفاهيم التي كانت مفقودة في جافاسكربت حتى وقت قريب. ومع ذلك، قدمت جافاسكربت ميزة جديدة لتحديد خاصيات و توابع خاصة باستخدام الرموز الخاصة (Private Symbols) أو من خلال أسلوب الحرف المزدوج (#) في الإصدارات الحديثة من اللغة.
تُستخدم الخاصيات الخاصة لحماية البيانات الداخلية للكائن من الوصول أو التعديل المباشر من الخارج. هذا النوع من البيانات يقتصر الوصول إليه فقط من داخل الكائن نفسه أو من خلال التوابع الخاصة به.
مثال على ذلك:
javascriptclass Person {
#name; // خاصية خاصة
#age; // خاصية خاصة
constructor(name, age) {
this.#name = name;
this.#age = age;
}
greet() {
console.log(`Hello, my name is ${this.#name} and I am ${this.#age} years old.`);
}
getName() {
return this.#name;
}
}
let person1 = new Person('John', 30);
console.log(person1.getName()); // يمكن الوصول إلى الخاصية الخاصة عبر دالة عامة
console.log(person1.#name); // خطأ! لا يمكن الوصول إلى الخاصية الخاصة مباشرة
في هذا المثال، #name و #age هما خاصيتان خاصتان. هذه الخاصيات لا يمكن الوصول إليها مباشرة من الخارج، مما يضمن حماية البيانات الداخلية للكائن.
4. الخاصيات والتوابع المحمية (Protected Properties and Methods)
بينما تمثل الخاصيات الخاصة البيانات المخفية تمامًا عن الكائنات الأخرى، تأتي الخاصيات المحمية لتسمح بالوصول إليها داخل الكائنات المشتقة فقط. على الرغم من أنه لا يوجد مفهوم صريح للخاصيات المحمية في جافاسكربت، إلا أن هناك طرقًا تقليدية لمحاكاة هذا السلوك باستخدام نمط الوراثة.
من أشهر الأساليب لمحاكاة الخاصيات المحمية في جافاسكربت هي استخدام خاصيات غير عامة داخل الفئات المشتقة من الفئة الأصلية.
مثال على ذلك:
javascriptclass Animal {
constructor(name) {
this.name = name;
this._species = 'Unknown'; // خاصية محمية
}
speak() {
console.log(`${this.name} makes a sound.`);
}
}
class Dog extends Animal {
constructor(name) {
super(name);
this._species = 'Dog'; // يمكن تعديل الخاصية المحمية داخل الفئة المشتقة
}
bark() {
console.log(`${this.name} barks.`);
}
}
let dog = new Dog('Buddy');
console.log(dog._species); // يمكن الوصول إلى الخاصية المحمية داخل الفئة المشتقة
في هذا المثال، _species هو خاصية محمية، وهي متاحة داخل فئة Animal والفئات التي تشتق منها، مثل Dog. بالرغم من أنها غير محمية بشكل كامل، إلا أن استخدامها بتنسيق _ يشير إلى أنها يجب أن تُعامل كخاصية محمية.
5. استخدام التوابع الخاصة والمحمية في البرمجة الكائنية
تعتبر فكرة استخدام التوابع الخاصة والمحمية أساسية في البرمجة الكائنية (Object-Oriented Programming – OOP)، إذ أنها توفر وسيلة لفصل التفاصيل الداخلية للكائن عن الواجهة العامة. من خلال هذه الفكرة، يمكن للمطورين الحفاظ على البيانات الخاصة بالكائنات بشكل آمن، كما يمكنهم فرض قيود على كيفية تعديل هذه البيانات.
كما هو الحال في جافاسكربت، يتم دعم مفهوم التجميع (Encapsulation) عبر:
-
إخفاء البيانات: وذلك باستخدام الخصائص الخاصة والمحمية.
-
إخفاء التوابع: من خلال توفير واجهات عامة (public methods) للوصول إلى البيانات أو تعديلها بطريقة آمنة.
6. مثال تطبيقي لاستخدام الخاصيات والتوابع الخاصة والمحمية
لنأخذ مثالًا لتطبيق عملية إنشاء حساب مستخدم في تطبيق ويب. سنستخدم خاصيات خاصة لتخزين كلمة المرور وحمايتها من الوصول المباشر، بينما ستظل هناك واجهات عامة للوصول إلى المعلومات الأساسية للمستخدم.
javascriptclass User {
#password; // خاصية خاصة
constructor(username, password) {
this.username = username;
this.#password = password;
}
authenticate(inputPassword) {
return inputPassword === this.#password;
}
getUsername() {
return this.username;
}
}
let user1 = new User('john_doe', 'secret123');
console.log(user1.getUsername()); // يمكن الوصول إلى اسم المستخدم
console.log(user1.authenticate('secret123')); // التحقق من كلمة المرور
console.log(user1.#password); // خطأ! لا يمكن الوصول إلى كلمة المرور مباشرة
في هذا المثال، #password هو خاصية خاصة يمكن الوصول إليها فقط من داخل الكائن. وبالتالي، يمكن حماية كلمة المرور من الوصول غير المصرح به، وتوفير واجهة عامة للتحقق من صحة كلمة المرور.
7. الخاتمة
إن الخصائص والتوابع الخاصة والمحمية في جافاسكربت توفر مستوى إضافي من الأمان والتنظيم في البرمجة الكائنية. من خلال استخدامها بشكل مناسب، يمكن للمطورين ضمان أن الكائنات تظل نظيفة وآمنة من التلاعب غير المقصود. مع تطور جافاسكربت وإدخال ميزات مثل الخصائص الخاصة (#)، أصبحت لغة البرمجة هذه أكثر قوة في التعامل مع مفهوم التغطية (Encapsulation) وحماية البيانات.

