البرمجة الشيئية بلغة JavaScript، تتضمن إنشاء الكائنات التي تحتوي على البيانات والطرق لتلاعب تلك البيانات. على الرغم من أن JavaScript ليست لغة مبنية على الفصائل مثل جافا أو سي بلس بلس، إلا أنها تدعم مفاهيم البرمجة الشيئية من خلال نظام الوراثة المستند إلى النموذج في البروتوتايب.
OOP in JavaScript البرمجة الشيئية في جافاسكريبت
الكائنات في جافا سكريبت OOP
تُعدّ الكائنات لبنات البناء الأساسية في برمجة جافا سكريبت كائنية التوجه، حيث تُمثّل وحدات قابلة للتجريد تُجمّع البيانات والسلوكيات معاً.
خصائص الكائنات:
- الخصائص: تُمثّل البيانات المرتبطة بالكائن، وتُعرف أيضاً باسم الحقول أو الصفات.
- الطرق: تُمثّل السلوكيات التي يمكن للكائن القيام بها، وتُعرف أيضاً باسم الدوال أو الوظائف.
إنشاء الكائنات:
يتم إنشاء الكائنات من خلال الفئات، والتي تُمثّل بمثابة قوالب لتصميم الكائنات. تُعرّف الفئات خصائص الكائن وطرقها.
مثـــــــــــــــــــال لانشـــــــــــاء كائن OOP
// تعريف كائن باستخدام الدوال البنائية (Constructor Functions)
function Person(name, age) {
this.name = name;
this.age = age;
}
// إضافة طريقة (ميثود) إلى البروتوتايب (Prototype)
Person.prototype.greet = function() {
console.log(`مرحباً، أنا ${this.name} وعمري ${this.age} سنة.`);
};
// إنشاء كائن جديد
const person1 = new Person("أحمد", 30);
// استدعاء الطريقة (ميثود) على الكائن
person1.greet(); // سيطبع: مرحباً، أنا أحمد وعمري 30 سنة.
- تم إنشاء كائن
Person
باستخدام الدالة البنائية، حيث يحمل الكائن اسمًا وعمرًا. - تم إضافة طريقة
greet
إلى البروتوتايب للكائنPerson
، والتي تطبع رسالة ترحيبية تحتوي على اسم الشخص وعمره. - تم إنشاء كائن جديد من النوع
Person
باستخدام الكلمة المفتاحيةnew
. - تم استدعاء الطريقة
greet
على الكائن المنشأ، مما أدى إلى طباعة رسالة الترحيب.
هذا مثال بسيط يوضح كيفية استخدام البروتوتايبات والدوال البنائية في JavaScript لتحقيق المفاهيم الأساسية للبرمجة الشيئية، مثل الوراثة والتغليف.
البروتوتايبات والوراثة البروتوتايبية في جافا سكريبت
في جافا سكريبت، كل كائن يمتلك خاصية داخلية مخفية تُسمى البروتوتايب (prototype). يُعدّ البروتوتايب كائنًا آخر يُمكن للكائن الأول الوصول إلى خصائصه وطرقه.
الوراثة البروتوتايبية:
هي آلية في جافا سكريبت تسمح للكائنات برث خصائص وطرق من كائنات أخرى.
كيف تعمل الوراثة البروتوتايبية:
- البحث عن الخاصية: عندما يحاول الوصول إلى خاصية في كائن، يبحث محرّك جافا سكريبت عن هذه الخاصية في الكائن نفسه.
- البحث في البروتوتايب: إذا لم يتم العثور على الخاصية في الكائن، يبحث محرّك جافا سكريبت في بروتوتايب الكائن.
- التكرار: إذا لم يتم العثور على الخاصية في بروتوتايب الكائن، يتم تكرار البحث في بروتوتايب بروتوتايب الكائن، وهكذا حتى الوصول إلى كائن
null
. - الإرجاع
undefined
: إذا لم يتم العثور على الخاصية في أي من سلسلة البروتوتايبات، يتم إرجاع القيمةundefined
.
مثـــــــــــــــــــال
// تعريف كائن "شخص"
function شخص(الاسم) {
this.الاسم = الاسم;
}
// إضافة طريقة لكائن "شخص"
شخص.prototype.مرحبا = function() {
console.log(`مرحباً، أنا ${this.الاسم}.`);
};
// تعريف كائن "طالب" يرث من "شخص"
function طالب(الاسم, المستوى) {
شخص.call(this, الاسم);
this.المستوى = المستوى;
}
// توريث البروتوتايب
طالب.prototype = Object.create(شخص.prototype);
طالب.prototype.constructor = طالب;
// إضافة طريقة إضافية لكائن "طالب"
طالب.prototype.دراسة = function() {
console.log(`أنا ${this.الاسم}، وأنا طالب في المستوى ${this.المستوى}.`);
};
// إنشاء كائن "طالب" جديد
var طالب1 = new طالب("أحمد", 3);
// استخدام الطرق
طالب1.مرحبا(); // سيطبع: مرحباً، أنا أحمد.
طالب1.دراسة(); // سيطبع: أنا أحمد، وأنا طالب في المستوى 3.
هذا المثال يوضح كيفية استخدام البروتوتايبات والوراثة البروتوتايبية في جافا سكريبت. يتم تعريف الكائنات وإضافة الطرق إلى البروتوتايبات، ثم يتم توريثها إلى كائنات أخرى لاستخدامها في تطبيقات البرمجة الشيئية.
مثـــــــــــــــــــال اخــــــر
function Person(name) {
this.name = name;
}
Person.prototype.greet = function() {
console.log(`Hello, my name is ${this.name}`);
};
const person1 = new Person('John Doe');
person1.greet(); // Hello, my name is John Doe
في هذا المثال، لدى الكائن person1
خاصية name
وطرق greet()
.
- خاصية
name
: تم تعريفها في الكائنperson1
نفسه. - طريقة
greet()
: تم تعريفها في بروتوتايب فئةPerson
، وبالتالي يمكن للكائنperson1
الوصول إليها.
فوائد الوراثة البروتوتايبية:
- إعادة الاستخدام: تُتيح إعادة استخدام الكود بسهولة، حيث يمكن تعريف الخصائص والطرق مرة واحدة في بروتوتايب الفئة، ثم يمكن الوصول إليها من قبل جميع الكائنات التي تم إنشاؤها من تلك الفئة.
- التنظيم: تُساعد في تنظيم الكود، حيث تُحافظ على خصائص وطرق الكائنات ذات الصلة معًا في مكان واحد.
- الصيانة: تُسهّل عملية صيانة الكود، حيث يمكن تعديل الخصائص والطرق في بروتوتايب الفئة، مما يؤثر على جميع الكائنات التي تم إنشاؤها من تلك الفئة.
التغليف
التغليف هو أحد مبادئ البرمجة الكائنية الهدفية (OOP) الذي يركز على إخفاء التفاصيل الداخلية للكائن عن العالم الخارجي، مع السماح بالوصول إلى وظائفه فقط من خلال واجهة محددة.
كيف يتم تطبيق التغليف في جافا سكريبت؟
في جافا سكريبت، يتم تطبيق التغليف بشكل أساسي من خلال الخصائص (properties) والطرق (methods).
الخصائص: هي قيم مرتبطة بكائن معين. يمكن جعل الخصائص عامة (
public
) أو خاصة (private
).- الخصائص العامة: يمكن الوصول إليها من أي مكان في البرنامج.
- الخصائص الخاصة: لا يمكن الوصول إليها إلا من داخل الكائن نفسه.
الطرق: هي وظائف مرتبطة بكائن معين. يمكن جعل الطرق عامة أو خاصة أو محمية (
protected
).- الطرق العامة: يمكن استدعاؤها من أي مكان في البرنامج.
- الطرق الخاصة: لا يمكن استدعاؤها إلا من داخل الكائن نفسه.
- الطرق المحمية: يمكن استدعاؤها من داخل الكائن نفسه أو من الكائنات الفرعية.
مثـــــــــــــــــــال
class Person {
#name; // خاصية خاصة
constructor(name) {
this.#name = name;
}
getName() {
return this.#name;
}
setName(newName) {
if (newName.length < 3) {
throw new Error("يجب أن يكون اسم الشخص أطول من 3 أحرف");
}
this.#name = newName;
}
}
const person = new Person("Bard");
console.log(person.getName()); // سيطبع "Bard"
person.setName("Ali"); // سيتم تعيين الاسم بنجاح
person.setName("B"); // ستُلقى خطأ
في هذا المثال، يتم استخدام الخاصية الخاصة #name
لتخزين اسم الشخص. يتم استخدام الطرق getName
و setName
للوصول إلى اسم الشخص وتعديله على التوالي.
مثال على البرمجة الكائنية الهدفية (OOP) في جافا سكريبت: إنشاء لعبة بسيطة
الهدف: إنشاء لعبة بسيطة “حجر ورقة مقص” باستخدام مبادئ البرمجة الكائنية الهدفية (OOP) في جافا سكريبت.
المكونات:
- كائن “لاعب”: يمثل اللاعب في اللعبة.
- كائن “الكمبيوتر”: يمثل خصم اللاعب.
- كائن “اللعبة”: يدير اللعبة.
class Player {
constructor(name) {
this.name = name;
this.choice = null;
}
selectChoice(choice) {
this.choice = choice;
}
getChoice() {
return this.choice;
}
}
class Computer {
selectChoice() {
const choices = ["حجر", "ورقة", "مقص"];
const randomIndex = Math.floor(Math.random() * choices.length);
return choices[randomIndex];
}
}
class Game {
constructor(player, computer) {
this.player = player;
this.computer = computer;
}
play() {
console.log(`${this.player.name} يختار ${this.player.getChoice()}`);
console.log(`${this.computer.selectChoice()} تم اختياره من قبل الكمبيوتر`);
if (this.player.getChoice() === this.computer.selectChoice()) {
console.log("تعادل!");
} else if (this.player.getChoice() === "حجر" && this.computer.selectChoice() === "مقص") {
console.log(`${this.player.name} يفوز!`);
} else if (this.player.getChoice() === "ورقة" && this.computer.selectChoice() === "حجر") {
console.log(`${this.player.name} يفوز!`);
} else if (this.player.getChoice() === "مقص" && this.computer.selectChoice() === "ورقة") {
console.log(`${this.player.name} يفوز!`);
} else {
console.log(`${this.computer.selectChoice()} يفوز!`);
}
}
}
// إنشاء اللاعب والكمبيوتر
const player = new Player("Bard");
const computer = new Computer();
// إنشاء اللعبة
const game = new Game(player, computer);
// لعب اللعبة
game.play();
شرح الكود:
- كائن “لاعب”
- يُنشأ باستخدام الكلمة الرئيسية
new
. - يحتوي على خصائص
name
وchoice
. selectChoice
طريقة تسمح للاعب باختيار “حجر” أو “ورقة” أو “مقص”.getChoice
طريقة تُعيد اختيار اللاعب.
- يُنشأ باستخدام الكلمة الرئيسية
- كائن “الكمبيوتر”
- يُنشأ باستخدام الكلمة الرئيسية
new
. selectChoice
طريقة تختار عشوائيًا “حجر” أو “ورقة” أو “مقص”.
- يُنشأ باستخدام الكلمة الرئيسية
- كائن “اللعبة”
- يُنشأ باستخدام الكلمة الرئيسية
new
. - يحتوي على خصائص
player
وcomputer
. play
طريقة تدير اللعبة وتعرض النتيجة.
- يُنشأ باستخدام الكلمة الرئيسية
ملاحظات:
- هذا مثال بسيط يوضح مبادئ OOP الأساسية في جافا سكريبت.
- يمكن توسيع هذا المثال ليشمل ميزات إضافية، مثل:
- القدرة على لعب عدة جولات.
- تتبع النتائج.
- عرض واجهة مستخدم رسومية.
موارد إضافية:
- JavaScript for Beginners: https://www.freecodecamp.org/news/learn-javascript-for-beginners/ – دورة مجانية لتعلم جافا سكريبت من موقع freeCodeCamp.