সেইম ড্রেসে class পার্টি
একটা ক্রিকেট টিমের কথা চিন্তা কর। দেখবি, সবাই একই স্টাইলের জার্সি পড়ছে। সবার কিছু নিজস্ব বৈশিষ্ট্য আছে। ব্যাটিং অর্ডার আছে। সিরিয়াল ধরে দাঁড়িয়ে গেলে সবাইকে দেখতে একটা সিমিলার ভাইভ দেয়। ওরা যে সেইম টিমের, সেটা দেখেলেই বুঝা যায়।
একইভাবে প্রোগ্রামিং করার জন্য একই টাইপের জিনিস অনেক সময় বানাইতে হয়। যেমন: তোর ওয়েবসাইট যদি অনেক অনেক মানুষ ইউজ করে, তাহলে সব মানুষ বা ইউজারের ডাটা সেইম স্টাইল বা সেইম স্ট্রাকচারের হবে। সবার নাম, ই-মেইল এড্রেস, পাসওয়ার্ড, ঠিকানা ও ফোন নাম্বার থাকবে। এইগুলার মান একেকজনের জন্য একেক রকম হবে। তবে কী কী তথ্য থাকবে, সেটা সবার জন্য সেইম থাকবে।
আপাতত একটা সিম্পল অবজেক্ট তুই বানাই ফেল। জাস্ট সেকেন্ড ব্র্যাকেট দিয়ে ভিতরে কয়েকটা প্রোপার্টি লিখে ফেল।
const player = {
name: 'Dual Lal',
runs: 8000,
wickets: 108,
};তবে এই রকম যদি শত শত, হাজার হাজার, লক্ষ লক্ষ অবজেক্ট বানাতে হয়, তাহলে কে যে কোথায় কী এক্সট্রা যোগ করে ফেলছে, সেটা নিশ্চিত করা সম্ভব না। একেক জায়গায় একেকভাবে উল্টাপাল্টা করে ফেলতে পারে। এইভাবে সব অবজেক্টের মধ্যে সেইম স্ট্রাকচার নিশ্চিত করা টাফ।
আর এই কাজটাই করে class দিয়ে। ক্লাস দিয়ে নিশ্চিত করে সিমিলার টাইপের সব অবজেক্টে সেইম প্রোপার্টি আর সেইম মেথড থাকবে। সবার সেইম স্ট্রাকচার থাকবে।
class পার্টি
ক্লাস হলো একটি টেমপ্লেট, যা থেকে তুই একই টাইপের একাধিক অবজেক্ট তৈরি করতে পারবি। প্রতিটি অবজেক্টের মধ্যে একই বৈশিষ্ট্য থাকবে। ক্লাস লেখার জন্য প্রথমেই তুই class কি-ওয়ার্ড লিখবি, তারপর ক্লাসের একটা নাম দিবি। সাধারণত ক্লাসের নাম বড় হাতের অক্ষর দিয়ে শুরু করতে হয়। তারপর দুইটা সেকেন্ড ব্র্যাকেট দিবি। নিচের মতো করে—
class Player {
}ক্লাস থেকে অবজেক্ট বানানোর সময় একটা মেইন জিনিস মাথায় রাখতে হবে। ক্লাস হচ্ছে টেমপ্লেট, এইটা কিন্তু অবজেক্ট না। ক্লাস হচ্ছে একটা স্ট্রাকচার, একটা কমন শেইপ, একটা ফর্মা বা একটা মোল্ড, যেটা দিয়ে অবজেক্ট বানানো হবে। অর্থাৎ ক্লাস থেকে অবজেক্ট বানাইতে হবে। বানানোকে ইংরেজিতে construction বলে। আর এই construction যে করে, তাকে কনস্ট্রাকটর (constructor) বলে। এজন্য প্রত্যেকটা ক্লাসের ভিতরে কনস্ট্রাকটর নামে একটা স্পেশাল ফাংশন থাকে। জাস্ট দেখতে ফাংশনের মতো। এইটার আগে কোনো function কি-ওয়ার্ড থাকে না। জাস্ট constructor লিখে দিবি, আর এইটার মধ্যে যত প্যারামিটার লাগবে, সেটা নিয়ে নিবি।
class Player {
constructor(name, runs, wickets){
}
}ক্লাস কেন লিখে? ক্লাস লিখে একই স্টাকচারের অনেক অনেক অবজেক্ট বানানোর জন্য। এই অবজেক্ট বানানোর কাজ কে করবে? সেটা করবে এই constructor মেথড। এই constructor মেথড (ফাংশন) ডিক্লেয়ার করলেও এইটাকে সরাসরি কেউ কল করে না; বরং ক্লাস দিয়ে অবজেক্ট বানাতে গেলে ইনডাইরেক্টলি অটোমেটিকভাবে এই কনস্ট্রাকটর মেথডকে কল করা হয়ে যায়।
ক্লাস তৈরি করার সময় constructor নামে একটা মেথড ডিক্লেয়ার করে। এটা দেখতে ফাংশনের কাছাকাছি। এটাতে প্যারামিটার দেয়া যায়, ডিফল্ট মান সেট করা যায়, ফাংশনের মতো কল করা যায়। তারপরেও এইটাকে ফাংশন বলে না। এইটাকে মেথড বলে এবং এই মেথডের নাম এক্সাক্টলি constructor হতে হবে। অন্য কোনো নাম দিলে হবে না। তা ছাড়া constructor শব্দটাই এই কাজের জন্য রিজার্ভ করে রাখছে।
যা-ই হোক, এইবার কথা হচ্ছে— ক্লাস থেকে অবজেক্ট বানায় কীভাবে? বানানোর সিস্টেম খুবই সিম্পল। বামপাশে ভেরিয়েবলের মতো করে একটা নাম দিবি। তারপর ডানপাশে new লিখে ক্লাসের নাম লিখে দুইটা ব্র্যাকেট দিয়ে দিবি। যদি কনস্ট্রাকটর মেথডে কোনো প্যারামিটার থাকে, তাহলে ক্লাসের নামের পর প্যারামিটারের মতো করে সেগুলা দিতে হবে। আর যদি কনস্ট্রাকটর মেথডের কোনো প্যারামিটার না থাকে, তাহলে ক্লাসের পর ব্র্যাকেটের ভিতরে কোনো কিছু লেখা লাগবে না।
class Player {
constructor(){
}
}
const mushi = new Player();
console.log(mushi);
Output: Player {}ওপরের ক্লাসে কোনো প্রোপার্টি নাই। কোনো মেথড নাই। তাই সেটা থেকে যে অবজেক্ট বানাইছি, সেটার মধ্যেও কিছু নাই। জাস্ট খালি একটা অবজেক্ট।
খালি না হয়ে ভরাট অবজেক্ট চাইলে সেটার মধ্যে দুইটা জিনিস যোগ করতে হয়। এক হচ্ছে বৈশিষ্ট্য বা প্রোপার্টি। আরেকটা হচ্ছে মেথড। সো, অবজেক্টে যদি প্রোপার্টি থাকতে হয়, তাহলে সেটা ক্লাসে থাকতে হয়। আর ক্লাসে যদি প্রোপার্টি থাকতে হয়, তাহলে সেটা constructor-এর ভিতরে লিখতে হবে এবং লেখার সময় দুইটা কাজ করতে হবে।
১) অনেকটা ভেরিয়েবল ডিক্লেয়ারের মতো করে হলেও বামপাশে this লিখে তারপর ডট চিহ্ন দিয়ে তারপর প্রোপার্টির নাম লিখতে হবে।
২) তারপর সমান চিহ্ন দিয়ে ডানপাশে হয় প্রোপার্টির মান বসিয়ে দিতে হবে। আর যদি অবজেক্ট বানানোর সময় একেক প্রোপার্টির মান একেক রকমের করতে চাস, তাহলে সেটা constructor মেথডের প্যারামিটার হিসেবে নিতে হবে এবং সেই প্যারামিটার প্রোপার্টির মান হিসেবে বসিয়ে দিতে হবে।
যতবার তুই ক্লাস থেকে অবজেক্ট তৈরি করবি, ততবার আলাদা আলাদা অবজেক্ট তৈরি করতে পারে এবং প্রত্যেকটা অবজেক্টের আলাদা আলাদা প্রোপার্টি থাকতে পারে, যাতে কারো সাথে কোনো রিলেশন না থাকে। একটা আরেকটা প্রোপার্টির মধ্যে কোনো রেফারেন্স থাকবে না।
নিচে আমি একটা ক্লাস লিখলাম তিনটা প্রোপার্টির নিয়ে। সেজন্য কনস্ট্রাকটরের মধ্যে তিনটা প্যারামিটার রাখলাম। সাধারণত প্রোপার্টির নাম আর constructor মেথডের প্যারামিটারের নাম একই থাকে। তাহলে বুঝতে সুবিধা হয়। কোন প্রোপার্টির সাথে কোন প্যারামিটারের মান বসবে।
আর আগের মতো করেই এই ক্লাস থেকে তুই অবজেক্ট বানাতে পারবি। আগের মতোই ডানপাশে new লিখে তারপর ক্লাসের নাম লিখে ফেলবি। ডিফারেন্স শুধু এখন যেহেতু কনস্ট্রাকটর মেথডে তিনটা প্যারামিটার আছে, তাই class-কে কল করার সময় তিনটা আর্গুমেন্ট দিয়ে দিতে হবে।
class Player {
constructor(name, runs, wickets){
this.name = name;
this.runs = runs;
this.wickets = wickets;
}
}
const tam = new Player('Tam', 5000, 2);
console.log(tam);
const mash = new Player('Mash', 3200, 180);
console.log(mash);
Output:
{name: 'Tam', runs: 5000, wickets: 2}
{name: 'Mash', runs: 3200, wickets: 180}ওপরে আমরা দুইটা ডিফারেন্ট অবজেক্ট তৈরি করেছি সেইম ক্লাস দিয়ে। দুইটার স্ট্রাকচার কিন্তু সেইম। শুধু মানগুলি আলাদা আলাদা। এইটাই ক্লাসের মজা।
অবজেক্ট তৈরি করার সময় new লিখে বুঝানো হয়, তুই ক্লাস থেকে নতুন একটা অবজেক্ট তৈরি করতে চাস।
অবজেক্টের পিতৃপরিচয়
কোনো একটা ক্লাস থেকে যতগুলা অবজেক্ট তৈরি হয়, সবগুলাকে বলা হয় ওই ক্লাসের instance। ইংরেজি instance শব্দের বাংলা মানে হচ্ছে নমুনা, নিদর্শন ইত্যাদি। অর্থাৎ কোনো ক্লাসের একটা নমুনা অবজেক্ট বানানো হয়েছে। চাইলে typeof-এর মতো করে কোনো একটা অবজেক্ট কোনো একটা ক্লাসের ইনস্ট্যান্স কি না, সেটাও চেক করা যায়।
নিচে একটা ক্লাস বানালাম FoodOrder নামে। সেখানে চারটা প্রোপার্টি আছে। তবে constructor ফাংশনে প্যারামিটার আছে তিনটা। কারণ, একটা প্রোপার্টির মান সব অবজেক্টের জন্য সেইম রাখলাম। সেটা constructor-এর ভিতরে সেট করে দিব জাস্ট দেখার জন্য। আর নিচে দুইটা অবজেক্ট বানালাম। এই ক্লাস থেকে—
class FoodOrder {
constructor(customer, food, price ) {
this.vendor = 'panda';
this.customer = customer;
this.food = food ;
this.price = price ;
}
}
const order1 = new FoodOrder( 'Mizan', 'Pizza', 1500);
const order2 = new FoodOrder( 'Azim', 'Burger', 1000);
console.log(order1);
console.log(order2);
Output:
{vendor: 'panda', customer: 'Mizan', food: 'Pizza', price: 1500}
{vendor: 'panda', customer: 'Azim', food: 'Burger', price: 1000}ইনস্ট্যান্স
কোনো একটা ক্লাস থেকে যতগুলা অবজেক্ট তৈরি হয়, সবগুলাকে বলা হয় ওই ক্লাসের instance। ইংরেজি instance শব্দের বাংলা মানে হচ্ছে নমুনা, নিদর্শন ইত্যাদি। অর্থাৎ কোনো ক্লাসের একটা নমুনা অবজেক্ট বানানো হয়েছে। চাইলে typeof-এর মতো করে কোনো একটা অবজেক্ট কোনো একটা ক্লাসের ইনস্ট্যান্স কি না, সেটাও চেক করা যায়।
এখন চেক করে দেখ, order1 অবজেক্ট foodOrder-এর ইনস্ট্যান্স কি না।
console.log(order1 instanceof FoodOrder);
Output: true
একইভাবে চেক করে দেখ, একটা অন্য অবজেক্ট, সেটা FoodOrder-এর ইনস্ট্যান্স কি না।
console.log( { age: 91 } instanceof FoodOrder);
Output: falseকোনো অবজেক্ট এসে যদি বলে, আমি সেই ক্লাসের সন্তান, তাহলে তুই DNA টেস্টের মতো করে instanceOf দিয়ে ধরে ফেলতে পারবি।
Practice:
- ক্লাস আর অবজেক্টের মধ্যে ডিফারেন্স কী?
- ক্লাস ইনস্ট্যান্স বলতে কী বুঝায়?
- Vehicle নামে একটা class লিখ, সেখানে constructor-এর মধ্যে brand, model এবং price প্রোপার্টি রাখ। Vehicle ক্লাস থেকে দুইটা instance বানা, একটা BMW X5, যেখানে ব্র্যান্ড BMW, মডেল X5 আর price তুই তোর ইচ্ছামতো কোনো একটা দাম বসিয়ে দে। আরেকটা গাড়ির জন্য ব্র্যান্ড Tesla, মডেল Model 3 আর price 40000 ।
- Worker নামে একটা class বানিয়ে সেখানে id, name আর hoursWorked নামে প্রোপার্টি যোগ কর। তারপর নতুন worker বানা, যার id হবে 101, name হবে Tom Cruise আর hoursWorked হবে 40।
- Library নামে একটা class বানা, যেখানে constructor-এর মধ্যে তিনটা প্রোপার্টি থাকবে name, books, আর location। তারপর নতুন একটা library বানা, যার নাম Central Library, books 10000 আর location Dhaka। এরপর instanceOf দিয়ে চেক কর তোর বানানো অবজেক্টটা Library ক্লাসের ইন্সটান্স কি না।
- Classroom নামে একটা class বানা, যেখানে students নামে একটা প্রোপার্টি থাকবে, যা শুরুতে খালি array হবে। constructor-এর মধ্যে section আর teacher প্রোপার্টি রাখ। তারপর Classroom থেকে একটা instance বানা, যার section হবে A আর teacher হবে Mr. Plumber ।
- Product নামে একটা class বানা, যেখানে constructor-এর মধ্যে name, category আর stock থাকবে। তারপর নতুন একটা product বানা, যার নাম হবে Mobile, category হবে Electronics আর stock হবে 50।
- Product নামে একটা class বানা, যেখানে constructor-এর মধ্যে name, category আর stock থাকবে। তারপর নতুন একটা product বানা, যার নাম হবে Mobile, category হবে Electronics আর stock হবে 50। যদি অবজেক্ট বানানোর সময় কেউ stock প্রোপার্টির মান না দেয়, তাহলে stock-এর ডিফল্ট মান 0 দিয়ে দিবি।