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

السؤال

نشر

عندما أقوم بعمل دالة بانية constructor وأريد أن أجعلها تأخذ بعض المدخلات inputs يجب أن أستعمل this بالشكل التالي:

function User(name, email, age) {
  this.name = name;
  this.email = email;
  this.age = age;
  console.log("user created with name", this.name);
}

const firstUser = new User("full name", "user@mail.com", 23);

لماذا لا نكتب الكود بطريقة مباشرة:

function User(name, email, age) {
  console.log("user created with name", name);
}

const firstUser = new User("full name", "user@mail.com", 23);

هل يوجد فرق بين الطريقتين؟ وأيهما أفضل؟

Recommended Posts

  • 1
نشر

في حال كنت تريد اعتبار الكائن عحاوية للخصائص ضمنها وللتوابع الخاصة للتعامل مع تلك الخصائص هنا يأتي دور البرمجة كائنية التوجه وتعريف المفهوم كصنف ضمن التطبيق، مثال يمكنك بعد تعريف الكائن الإشارة لاحقًا للخصائص التي يحتويها، وهنا يأتي دور الكلمة this حيث تعين قيم الخصائص على كل كائن جديد يتم إنشاؤه باستخدام new:

function Person(name) {
  this.name = name;
  this.sayHi = () => console.log("My name is " + this.name);
}

const emad = new Person("Emad");

// لاحقا يمكن التالي

emad.sayHi(); // My name is Emad
console.log(emad.name) // Emad

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

function Person(name) {
  console.log("My name is " + this.name);
}

// يستدعى في كل مرة نريد التنفيذ

Person("Emad");  // My name is Emad
Person("Bilal"); // My name is Bilal

يمكنك الاستفادة من قراءة المقالات التالية:

 

  • 1
نشر

في الحقيقة وفي مثالك، لا أظن أنه يوجد أي فرق جدير بالذكر بين الطريقتين فأنت في المرة الأولى تستقبل المعامل name عن طريق الباني وتسنده الى خاصية تخص الكائن User وطباعتها في آخر الأمر. ثم في المرة الثانية باستقبال المعامل name عن طريق الباني ثم طباعته مباشرة. ففي المرة الاولى، name معامل وخاصية للكائن. وفي المرة الثانية، معامل وفقط.

كنت لأختار الطريقة الأولى، وذلك لأنك تقوم بتهيئة كائنات جديدة عن الصنف User عن طريق الكلمة المفتاحية new التي تقوم بإنشاء كائن فيفترض ان كل منها يميز عن الآخر. كما ان الطريقة الأولى تخدم مبدأ التوسع scalability فالخاصية name ستكون متاحة أيضا للاستعمال او اعادة التعيين من قبل اي تابع للكائن يتوقع انشاءه مستقبلا قبل طباعة خرجه.

  • 0
نشر

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

  • قمت بحذف الكلمة المفتاحية this
  • محاولة الوصول لخاصية بعد إنشاء الصنف وهي تعيد undefined أي لم يتم إنشاء خاصية للصنف بالأصل
function User(name, email, age) {
  name1 = name;
  email1 = email;
  age1 = age;
}

const firstUser1 = new User("full name", "user@mail.com", 23);

console.log(firstUser1.name1);
undefined

console.log(firstUser1.email1);
undefined

بدون استعمال this أنت تقوم بتعريف متغيرات مؤقتة ضمن الدالة البانية name1 - email1 - age1 ولن تستفيد منهم بعد إنتهاء التنفيذ و إنشاء الكائن الذي سيكون بدون خواص (يتوجب استخدام this)

أي خاصية نسندها ل this سوف تصبح من خواص الصنف و الكائنات المشتقة منه

بدون this:

  •  props.jpg.56d174c923b732913b61693abdb1e056.jpg

مع this:

  • here.jpg.6d3ca7399d3075c2d3843778b4fc0a97.jpg

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...