javascript-bootcamp

Prototype

আজকের আলোচনার বিষয় হচ্ছে জাভাস্ক্রিপ্টের Prototype. গত আলোচনাতে আমারা জাভাস্ক্রিপ্টের Factory pattern নিয়ে আলোচনা করেছি। জাভাস্ক্রিপ্ট প্রোগ্রামার বা ডেভেলপার হিসাবে Prototype সম্পর্কে পরিষ্কার ধারণা থাকা অতীব জরুরী। তাই চেষ্টা করবো আজকে কিছু ইউজফুল উদারণ দিয়ে Prototype নিয়ে একটু লেখতে। আশা করি, আজকের পর থেকে Prototype নিয়ে কাজ করতে কখনো সমস্যা হবে না। চলুন শুরু করা যাক।

নিচের Constructor Function টা লক্ষ্য করুন।


function Car(color, name, manufactureDate) {
  this.color = color;
  this.name = name;
  this.manufactureDate = manufactureDate;

  this.getColor = function () {
    return this.color;
  };
  this.getName = function (){
      return this.name;
  }
  this.getManufactureDate = function(){
      return this.manufactureDate;
  }
}

চলুন আমরা firstCar এবং secondCar নামে দুইটি Object তৈরি করি Car Constructor Function ব্যবহার করে।


const firstCar = new Car("red", "Ferrari", "2020");
const secondCar = new Car("yellow", "Lamborgini", "2021");

আশা করি এই পর্যন্ত বোঝতে কোন সমস্যা হয় নি। যদি কোন সমস্যা হয়ে থাকে তবে আমাদের Constructor Function এর আলোচনাটি দেখার জন্য অনুরোধ করছি।

উপরের কোডটি লক্ষ্য করলে দেখা যাবে যে, জাভাস্ক্রিপ্ট ইঞ্জিন আমাদের Constructor Function Car এর দুইটি কপি তৈরি করেছে। একটি firstCar আর অন্যটি secondCar এর জন্য। এখন আমরা Constructor Function Car দিয়ে যত Object তৈরি করব Constructor Function Car এর ঠিক তত গুলা কপি তৈরি হবে। একবার ভাবুন তো, প্রত্যেকটি Object এর জন্য একটা ফাংশনের আলাদা আলাদা Instance তৈরি করা মেমোরি অপচয় ছাড়া আর কিছুই নয়। এই সমস্যা আমার খুব সহজে জাভাস্ক্রিপ্টের Prototype এর মাধ্যমে সমাধান করতে পারি।

চলুন Prototype নিয়ে আলোচনা শুরু করা যাক। যখন জাভাস্ক্রিপ্টে একটি Object তৈরি করা হয় ঠিক তখনই জাভাস্ক্রিপ্ট ইঞ্জিন ওই Object এ Prototype নামে একটা Property যোগ করে। মূলত, জাভাস্ক্রিপ্টে যেকোনো Object Type এর মধ্যে Prototype Property আছে। Array Type এর মধ্যে একটা Prototype Property আছে। Date Type এর মধ্যে Prototype Property আছে। এমনকি আমরা যদি কোন Custom Object Type তৈরি করি তবে তার মধ্যেও Prototype Property আছে। আমরা জানি যে, জাভাস্ক্রিপ্টে ফাংশনও এক ধরনের Object. তাই ফাংশনেরও একটি Prototype Property আছে। কোন Object এর Prototype Property টি ব্যবহার করতে হয় functionName.prototype দিয়ে।

এখন চলুন আমরা একটি নাম্বারের Array বানাই যেখানে কিছু সংখ্যা থাকবে। যেমনঃ


const arr = [1, 2,3,4,5];
console.log(arr);

উপরের কোডটি রান করালে দেখব যে, arr এর প্রতিটি ইনডেক্সের মান ব্রাউজারে প্রিন্ট করছে। কিন্তু এর নিচে দেখব, __proto__ নামে একটা Object আছে। এই Object টিকে যদি Expand করি তবে দেখব যে, এইখানে push, concat, indexOf এমন অনেক পরিচিত মেথড বা ফাংশন রয়েছে যা আমরা প্রায়ই Array Manipulation এর কাজ এ ব্যবহার করে থাকি। আমার যদি আরও কোন Array বানাই এবং ওই Array এর __proto__ property টি দেখি তবে দেখব যে আগের মত অনেক পরিচিত মেথড বা ফাংশন এখানেও রয়েছে। কিন্তু এই মেথড বা ফাংশন গুলো কোথা থেকে এলো। আমরা তো কোথাও এইগুলা Define বা Declare করি নি।

একই constructor Function ব্যবহার করে তৈরি হওয়া সমস্ত Object একই Prototype Object টিকে Share করে। সুতরাং, Array Constructor Function ব্যবহার করে তৈরি করা সব Array তাই একই Prototype Object কে Share করবে। তাই যখনই আমরা একটা Array Declare করি ঠিক তখনই Array এর জন্য নির্ধারিত Prototype Object টি Array এর ভিতর Assign হয়ে যায়। আর Array এর জন্য নির্ধারিত Prototype Object টির ভিতর push, concat, indexOf এর মত অনেক পরিচিত মেথড বা ফাংশন আগে থেকে লিখা আছে। তাই আমরা যত খুশি Array Type ভেরিয়েবল Declare করি না কেন, সব কয়টার __proto__ ভিতর পূর্ব নির্ধারিত মেথড বা ফাংশন গুলো থাকবে।

এখন তাহলে চলুন আমরা আমাদের Car Constructor Function এর মধ্যে থাকা getColor, getName, getManufactureDate মেথডগুলোকে সরিয়ে Car Constructor Function এর Prototype এর মধ্যে ঢোকাই; যাতে করে Car Constructor Function দিয়ে তৈরি সব Object এর মধ্যে মেথডগুলোকে automatically চলে আসে।


function Car(color, name, manufactureDate) {
  this.color = color;
  this.name = name;
  this.manufactureDate = manufactureDate;
}

Car.prototype.getColor = function () {
  return this.color;
};
Car.prototype.getName = function () {
  return this.name;
};
Car.prototype.getManufactureDate = function () {
  return this.manufactureDate;
};

const firstCar = new Car("red", "Ferrari", "2020");
console.log(firstCar);

const secondCar = new Car("Yellow", "Lamborgini", "2021");
console.log(secondCar);

উপরের কোডটি যদি আমরা ব্রাউজার এ গিয়ে Output দেখি তবে দেখব যে, আমাদের Car Constructor Function এর ভিতর এখন আর মেথডগুলো নেই। মেথডগুলো এখন __proto__ এর ভিতর চলে গিয়েছে যা Car Constructor Function থেকে তৈরি সব Object ই automatically পেয়ে যাবে। প্রতিটি Object Instance এর ভিতর থাকলে যে মেমোরি অপচয় হওয়ার কথা ছিল টা এখন আর হচ্ছে না।

এই ছিল আজকের জাভাস্ক্রিপ্টের Prototype নিয়ে যত কথা।

হ্যাপি কোডিং।