چگونه interface را در جاوا اسکریپت پیاده سازی کنیم

چگونه interface را در جاوا اسکریپت پیاده سازی کنیم نوشته شده در   javascript 20 دسامبر , 2018 توسط  عباس حسینی

interface قراردادی است که کلاس های به ارث برنده از آن ملزم به اجرای بندهای آن میباشند یا به عبارت ساده inteface شامل یک سری متد مشخص است که هر کس از آن به ارث ببرد، مجبور به پیاده سازی آن متد هاست.

وقتی interface شامل یک سری متد های مشخص باشد ، کلاس ها میتوانند از آن به ارث برده و محتویات آن را در خود داشته باشند و نکته ای که دارای اهمیت است این است که کلاس ها میتوانند به هر تعداد که بخواهند از interface به ارث ببرند اما از کلاس دیگر فقط یکبار این امکان وجود دارد (البته در برخی زبان ها مثل سی شارپ)

متاسفانه از آنجاییکه زبان جاوا اسکریپت از interface پشتیبانی نمیکند برای دسترسی به آن مجبور هستیم از تیکه کد زیر استفاده کنیم


Object.prototype.implements = function(_interface)  {
  for (let prop in _interface) {
     if (!this.prototype.hasOwnProperty(prop)) {
        this.prototype[prop] = _interface[prop];
     }  
  }
}

نکته ای که در کد زیر وجود دارد این است که ساختار ارث بری درجاوا اسکریپت prototypical است، یعنی اگر یک کلاس داشته باشیم و کلاسی دیگر از آن به ارث ببرد آنچه که اتفاق میفتد اطلاعات یک پروپرتی به نام __proto__ موجود در کلاس پدر در فرزند هم قرار میگیرد و این کار از طریق اشاره کردن به آدرس آبجکت __proto__ انجام میشود

برای اطلاع از روش کار ارث بری در جاوا اسکریپت پیشنهاد میکنم مطلب زیر را مطالعه کنید

لینک مطالعه شی گرایی در جاوا اسکریپت

پس از اینکه بستری برای استفاده از ساختار interface ایجاد کردیم میتوانیم آن را در قالب یک مثال مشاهده کنیم، فرض کنیم دو کلاس از جنس پرنده یکی اردک و دیگری عقاب را داریم که قرار است هر دو خاصیت پرواز کردن را داشته باشند

برای این کار اگر کلاس های عقاب و اردک از یک interface به ارث ببرند هر دو متد پرواز کردن را خواهند داشت، پس دو کلاس با نام های Eagle و Duck تشکیل میدهیم که هر دو باید از اینترفیس IBird به ارث ببرند


class Duck {}
class Eagle {}

var IBird = {
    fly : function(){
        console.log('flying ...')
    }
}

Duck.implements (IBird)
Eagle.implements (IBird)

در ادامه نیز نتیجه اجرای آن را میتوانید مشاهده کنید که یک شی از کلاس عقاب ساخته شده و بعد متد fly صدا زده شده است، از آنجاییکه خود کلاس Eagle این متد را نداشته میتوان فهمید که interface آن را مجبور کرده که آن را پیاده سازی کند

See the Pen Javascript Interface by abbas hosseini (@abizebel) on CodePen.