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

السؤال

نشر

لدي صنف class يحتوي على بعض التوابع methods، ولدي أيضًا دالة تُعيد اسم أحد هذه التوابع كـنص String، على النحو التالي:

class Person {
  getAll() {
    // ...
  }
}

function methodName() {
  // ...
  return "getAll"; 
}

const firstUser = new Person();

كيف يمكنني إستخدام ناتج الدالة methodName لإستدعاء تابع موجود في الصنف Person في JavaScript؟

Recommended Posts

  • 1
نشر

يوجد أكثر من طريقة للقيام بهذا الأمر، وأسهل طريقة هي إستخدام طريقة الأقواس للوصول إلى التابع، كما يلي:

firstUser["getAll"];	// access the method
firstUser["getAll"]();	// call the method

وبالتالي يمكننا إستخدام ما يرجعه التابع methodName مكان النص في المثال السابق:

firstUser[methodName()];	// access the method
firstUser[methodName()]();	// call the method

أيضًا توجد طريقة أخرى عبر إستخدام الدالة eval:

eval("firstUser." + methodName() + "()");

لكن لا يُفضل إستخدام هذه الطريقة لأنها قد تؤدي إلى وجود ثغرة XSS والتي تسمح للمهاجم بتنفيذ أكواد JavaScript ضارة بالمستخدم بغرض سرقة البيانات أو التخريب بشكل عام.

  • 1
نشر

يمكنك تعريف هاته الدالة ضمن كائن الوثيقة window ثم اعادة استدعاءها، يكون ذلك بشكل ديناميكي كـ: 

class Person {
  getAll() {
    console.log('called')
  }
}

function methodName() {
  // ...
  return "getAll"; 
}

const firstUser = new Person();

window['target'] = new Function('firstUser.'+methodName()+'()')

target(); // called

نستعمل في هذا الكائن Function لإنشاء دالة جديدة.

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...