مقدمة في Object Oriented JavaScript

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

جافا سكريبت (التي لا علاقة لها تقريبا مع جافا) هي لغة مختلفة تماما. يوفر حرية وتعدد استخدام تكاد تكون غير محدودة ، مع انخفاض التعقيد في معظم المناطق. للأسف هناك بعض الأشياء الأكثر تعقيدًا في JavaScript بسبب الحرية التي تحاول منحك إياها.

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

إن الميزة الأكثر أهمية التي يقدمها OOP هي النسخ المتماثل ، مما يعني أنه يمكننا استنساخ كائن وإعادة استخدامه عدة مرات في نفس البرنامج ، متى احتجنا إليه. تعقيد ضمنية، وحقيقة أن جافا سكريبت ليست مبنية منذ البداية لتكون لغة OOP (مما يضيف المزيد من التعقيد)، هي واحدة من الأسباب التي تجعل يمثل OOP الحدود النهائية لكثير من المبرمجين الوليدة جافا سكريبت قبل أن كسب أجنحتها.

حسنا ، هذا صعب ، لكنه ليس بالأمر الصعب

قبل البدء في التفكير في مفهوم كائن جافا سكريبت Oriented بالنسبة لك ، فكر أنك تستخدم بالفعل برنامج OOP حتى إذا لم تكن على علم به. قد يختلف الاختصاصيون ، لكنني أعتقد أنه من الإنصاف القول إنك إذا كنت تستخدم بالفعل HTML و CSS ، وكنت تستخدم جافا سكريبت أحيانًا للتعامل مع عناصر HTML على صفحة الويب ، فأنت بالفعل مبرمج OOP خبيرًا.

كل عنصر HTML على صفحة الويب هو في الواقع كائن. وهي تناسب جميعًا في التسلسل الهرمي لنموذج كائن المستند (DOM) ، مما يعني أن لديهم فئة محددة ، وخصائص محددة ، ووراثة محددة. ما لم تقم بتعيين قيمة خاصية بشكل صريح ، ستستخدم جميع الكائنات قيم خصائصها الافتراضية. عندما تكتب تعليمات CSS ، ما يحدث بالفعل هو أنك تستخدم طريقة لتعديل قيمة خاصية واحدة أو أكثر لفئة ما.

في كل مرة تكتب فيها تعليمات HTML ، يتم إنشاء مثيل جديد للفصل الدراسي. وكما كنت بالتأكيد نعلم بالفعل، يمكنك إنشاء الفصول الدراسية الخاصة استنادا إلى الفئة المحددة مسبقا لكل نوع الكائن (على سبيل المثال، يمكنك إنشاء <h2 الطبقة = "العنوان الفرعي"> التي قد يكون لها خصائص مختلفة جدا من الطبقة الأصلية تم إنشاؤه من). يمكنك تحديد أن كائنات H2 بهذه الفئة سيكون لها لون وحجم مختلفان من كائنات H2 العادية. ويمكنك إعادة استخدام هذه الكائنات المعدلة كما تشاء. الكائن الأصلي H2 هو قالب كائن ويتم اشتقاق الفئة الجديدة من فئة القالب.

ﻟذا ، ﻧﻌم ، OOP ﻟﯾس ﺳﮭﻼ ، وﻟﮐﻧك ﻋﻟﯽ اﻷرﺟﺢ أﻧك ﺗﻔﻌل ذﻟك ﺑﺎﻟﻔﻌل ، ﻟذﻟك ﻣﺎ اﻟذي ﯾﺧﺷﯽ؟

المستوى التالي: إنشاء الكائنات الخاصة بك

إن التعامل مع كائنات DOM المدمجة أمر سهل للغاية. أنت في حاجة لمزيد من التحديات. جعل الأشياء الخاصة بك هو الخطوة الأولى إلى مستوى أعلى من OOP.

مع كل هذه الديباجة ، من المحتمل أنك تتوقع أن إنشاء كائن يمثل صفقة كبيرة تتطلب الكثير من التعليمات البرمجية المعقدة. بالتأكيد إذا كنت قد حاولت في أي وقت إنشاء فئات كائن مخصص بلغة مثل Java أو C # ، فسوف تتوقع إنشاء منشئ فصل طويل. فيما يلي كيفية قيامنا بذلك في JavaScript:

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

يظهر ما سبق كائن يسمى objAlien الذي يحتوي على كل هذه الخصائص المختلفة (المتغيرات العادية) والطرق (الوظيفة) المعرفة ضمنها. من الناحية الفنية ، إذاً ، يمكنك أيضًا اعتبار كائن ليكون مجموعة من المتغيرات و / أو الوظائف.

استخدام الكائنات في البرنامج

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

سيكون هذا الرمز جعل 20 الأجانب الخضراء غروي وضعها بكسل 110 بصرف النظر (حتى نتمكن من تخمين من ذلك أن الصورة المستخدمة لتخزين الأجنبي هي 100px واسعة، وهناك هامش 10px بين كل أجنبي). من الواضح ، بالطبع ، هذه ليست طريقة جيدة لتنفيذ لعبة في جافا سكريبت لأن هناك تقنيات أفضل ، لكن هذا المقال ليس عن صنع الألعاب ، بل يتعلق بإنشاء الكائنات واستخدامها.

لا يجب دائمًا إضافة الكائنات باستخدام الكلمة الرئيسية الجديدة. إليك عينة من التعليمة البرمجية من مشروع حيث يقوم كائن بتعيين خصائصه الخاصة باستخدام قيم كائن آخر:

هنا يمكننا أن نرى طريقة معقدة بالفعل لاستخدام كائن ، حيث يتم تمرير قيم الكائن إلى خاصية attr للكائن R. إذا كنت معتادًا على JSON (ترميز كائن جافا سكريبت) ، فقد تعتقد أن الجزء الأول من المثال يستخدم JSON مع وجود أخطاء في بناء الجملة ، ولكنه في الحقيقة ليس رمز JSON.

السبب في ذكر أسماء المتغيرات ، باستثناء التعبئة ، هو منع JavaScript من معالجة عامل ناقص في أسماء المتغيرات (وهي خصائص CSS). منذ كتابة هذا البرنامج ، تم إجراء تغييرات للسماح بخصائص CSS مثل أن يتم كتابة عائلة الخط كـ fontFamily ، ولكن لم يتم تكييف هذا الرمز القديم للاستفادة من هذا التغيير.

لماذا استخدام الأشياء؟

الأشياء هي الأفضل للحالات التي تحتاج فيها إلى إجراء مثيلات متعددة لشيء ما ، أو حيث تحتاج إلى طريقة بسيطة لتجميع البيانات المتعلقة بشيء من نوع معين. في مثال اللعبة أعلاه ، يمكننا أن نرى أنه من الممكن إنشاء نسخ متعددة من كائن objAlien ، لكن يمكننا أيضًا معالجة خصائص الكائن بعد إضافته ، والتي في حالة المثال كانت الخاصية x.

متى لا تستخدم الأشياء؟

يجب ألا تستخدم الأشياء إذا كنت تحتاجها فعليًا. من غير المجدي زيادة تعقيد البرامج الخاصة بك دون سبب وجيه. إذا تم تصميم البرنامج الخاص بك للقيام بشيء بسيط ، فلا يجب استخدام تقنيات OOP.

لماذا تكون كائنات JavaScript أسهل في الإنشاء من الكائنات في لغات OOP الأخرى

في لغات مثل Java وحتى Visual Basic ، فإن إنشاء الكائنات مهمة كبيرة. هذا لأنك تحتاج إلى إنشاء قالب فئة (أو استخدام قالب موجود) لإرساء الكائن الخاص بك قبل أن تتمكن من تعريفه. هذا ليس ضروريًا في جافا سكريبت لأننا نمنح تقنية بناء بسيطة (objectname = {…}). يمكن أن تتضمن الكائنات في JavaScript أيضًا أي نوع من المتغيرات ، بما في ذلك المصفوفات ، وإعلانات الأنواع غير موجودة. قيم الإرجاع اختيارية.

هل هو شيء جيد أو سيئا هو مسألة بعض الجدل، ولكن برامج جافا سكريبت أيضا لن تفشل إذا حاولت استدعاء قيمة الممتلكات التي لا وجود لها. على سبيل المثال ، إذا قمت بكتابته:

كنت أتوقع تماما خط التعليمات البرمجية المذكور أعلاه لوضع 5 داخل العنصر مع معرف "par1". ولكن إذا كنت تكتب شيئًا مثل:

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

إحدى الطرق لاختبار هذا هو:

هذه الاستجابة متطرفة قليلاً ، لكنك تحصل على الفكرة. لاحظ أننا نقوم باختبار "! = =" وليس "! =" ، وهو أمر سهل الخلط. إليك طريقة أخرى للقيام بذلك:

نفس الشيء ، بطريقة مختلفة. يمكنك أيضًا إضافة خصائص إلى الكائنات بعد إنشائها. يمكنك القيام بذلك بهذه الطريقة:

من الواضح أنه يمكنك أيضًا تغيير قيم الخصائص بنفس الطريقة. لإزالة الخاصية FavoriteFlavor من الكائن ، سنحتاج إلى القيام بذلك:

هناك عدد قليل جدا من الحالات التي يكون فيها هذا ضروريًا.

جعل الكائنات أكثر قابلة لإعادة الاستخدام

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

يطلق على هذه التقنية اسم نموذج الكائن ، مما يعني أنك تقوم بعمل قالب أساسي للكائن ولكن لا تملأ جميع التفاصيل. هنا أيضًا ، نقترب من الطريقة الحقيقية لإضافة كائنات إلى لعبة.

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

حتى الآن لإنشاء كائنات تستند إلى النموذج الأولي ، يمكننا القيام بذلك:

هذا هو نفس ما تفعله:

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

ماذا بعد؟

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

بوجدان رانسيا

بوجدان هو أحد الأعضاء المؤسسين لشركة Inspired Mag ، حيث اكتسب خبرة تقرب من سنوات 6 خلال هذه الفترة. يحب في وقت فراغه دراسة الموسيقى الكلاسيكية واستكشاف الفنون البصرية. انه مهووس جدا مع إصلاحات كذلك. يمتلك 5 بالفعل.