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

السؤال

نشر

أحاول استيعاب مفهوم Closures وPrototypal Inheritance في جافاسكريبت، هل يمكن لأحد شرح هاتين المفاهيم بطريقة بسيطة؟ وكيف يمكن استخدامهما بشكل فعّال في تطوير البرامج؟

ولماذا في جافاسكريبت يوجد Prototypal Inheritance أليس يتم الوراثة من الكلاسات مباشرًة؟

Recommended Posts

  • 0
نشر

- الـ Closures هي دوال تمتلك إمكانية الوصول إلى السكوب الخارجي، أي المتغيرات والإعدادات التي كانت موجودة عند تعريفها.

مثال:

function outer() {
  let name = "John";

  function inner() {
    console.log(name); 
  }

  return inner;
}

let myFunction = outer();
myFunction(); // يطبع "John"

- أما Prototypal Inheritance فهي التي تتبعها جافاسكريبت للوراثة. حيث أن الكائنات ترث من بعضها عبر الـ prototype chain. 

مثال:

let person = {
  name: "John"
};

let student = Object.create(person);
student.level = "First year";

console.log(student.name); // يطبع "John"

ولأن جافاسكريبت ليس لغة موجهة للكائنات، فهي لا تستخدم فكرة الكلاسات، بل تعتمد على هذه الطريقة.

في جافاسكريبت، لا يوجد نظام كلاسي بالمعنى الذي يوجد في بعض اللغات الأخرى. بدلاً من ذلك، يتم الاعتماد على نظام Prototypal Inheritance الذي يسمح بتبادل السمات بين الكائنات بشكل فعّال. هذا يجعل البرمجة أكثر مرونة وإمكانية إعادة الاستخدام.

يمكنك استخدام Prototypal Inheritance لبناء هياكل بيانات مرنة وتنظيم الكود بشكل أفضل، مما يسهل صيانة البرامج على المدى الطويل.

  • 0
نشر

السلام عليكم ,
بالنسبة للclosure :
الclosure مقصود به هو قدرة الدالة على التعرف على المتغيرات الموجودة في النطاق الجانبي لها و المعروف ب lexial scope , حتا إذا تم الانتهاء منه و تدميرة .
مثال :
 

function outerFunction(x) {
  // نلاحظ هنا أن الinnerFunction يمكنها التعرف على المتغير X
	// حيث أنة موجود في النطاق الجانبي لها 
  function innerFunction(y) {
    return x + y;
  }
  return innerFunction;
}

// صنع الclosure
var closure = outerFunction(10);

// الإستخدام
console.log(closure(5)); // الخرج: 15

كيف تم الخرج بشكل صحيح ؟ 
كيف تمكنت الدالة closure على `تذكر` الargument 10 ??

هنا يأتي قوة الclosure 
و هو بشكل مختصر قدرة الدالة على ال`تذكر` للمتغيرات الموجودة في النطاق الجانبي لها حتا بعد الإنتهاء منه


__________________________________________________

بالنسبة للprototype فكما هو معرووف أن الjavascript هي في الأصل prototype-based language 
ولا يوجد بها نظام لإدارة الclasses مثل بعض اللغات الأخرى 
و انها تدعم الoop عبر الprototypes 
و أن الclasses الموجودة بها ماهي الا syntax suger  
_____
الprototype في الجافاسكريبت هو خاصية أو proberity موجودة في كل object , و عند صناعة object جديد منة فأنة يورث الخصائص الموجودة فيه 
 

let x ={type:`car`};
console.log(x.hasOwnProperty(`type`)) // true

في المثال السابق نلاحظ استعمال دالة hasOwnProperty على الobj رغم عدم تعريفها عند صناعة الobj 
كيف تم ذلك ؟ كيف تعرف الobj عليها ؟
حدث ذلك لأن الobject x تعرف على الدالة hasOwnProperty لأنة ورثها  من الprototype الخاصة بالglobal parent object 

مثال أخر :
 

// تعريف دالة البناء
function Animal(name) {
  this.name = name;
}

// إنشاء object من الحيوان
const cat = new Animal("فلفي");

// الوصول إلى النموذجptototype وإضافة طريقة جديدة
Animal.prototype.sayHello = function() {
  console.log("مرحبًا، أنا " + this.name);
};

// الوصول إلى النموذجprototype وإضافة خاصية جديدة
Animal.prototype.species = "ثديي";

// الوصول إلى النموذجprototype وتعديل طريقة موجودة
Animal.prototype.sayHello = function() {
  console.log("مياو، أنا " + this.name);
};

// استخدام الprototype المحدث
cat.sayHello(); // يخرج: "مياو، أنا فلفي"
console.log(cat.species); // يخرج: "ثديي"


 

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...