Skip to content

Chapter 8: JavaScript Object-জাভাস্ক্রিপ্ট অবজেক্ট

8-1: object-এর অবজেকশন

Object Introduction

ভেরিয়েবল আর অ্যারের মধ্যে কথা কাটাকাটি। ভেরিয়েবল বলে আমি বড়। আমি সব করতে পারি। অ্যারে বলে আমি বড়। এই নিয়ে ঝগড়া, মারামারি করে মামলা পর্যন্ত চলে গেছে। আদালতে এইটা নিয়ে বিচার বসছে। সেখানে আইনজীবী বলছে— অবজেকশন মিলর্ড।

তখন বিচারক একটা প্রশ্ন করল— আমি যদি কোনো একটা স্টুডেন্টের ডাটা রাখতে চাই একটা জিনিসের মধ্যে, যেটার মধ্যে একজন স্টুডেন্টের আইডি, নাম, সে কোন ক্লাসে পড়ে, তার উচ্চতা, তার ওজন, সাবজেক্ট ইত্যাদি সব লিখে দিতে হবে। সেটা কি একটা ভেরিয়েবলে পারবি?

ভেরিয়েবল বলে, না হুজুর। আমি একটা ভেরিয়েবলে এত কিছু রাখতে পারব না। আমার অনেকগুলা ভেরিয়েবল লাগবে।

পাশে থেকে মুচকি হেসে অ্যারে বলল, আমি তো পারব। একটা অ্যারের মধ্যে সব কমা দিয়ে আলাদা আলাদা করে লিখে দিব নিচের মতো করে—

javascript
const student = [25, "kopa samsu", 9, 15, 40, "Bangla", "Math", "ICT"];

বিচারক হো হো করে হেসে বলল— এখানে কোনটা স্টুডেন্টের বয়স, কোনটা তার ক্লাস, আর কোনটা তার ওজন, কোনটা আইডি, সব গুবলেট পেকে গেছে। কোনো কিছু ক্লিয়ারলি বুঝা যাচ্ছে না।

একজন স্টুডেন্টের অনেকগুলা বৈশিষ্ট্য থাকে, সেগুলা বুঝতে হলে আলাদা আলাদাভাবে স্পষ্ট করে বুঝায় দিতে হবে। কোনটা কী জিনিস। যেমন, নিচে প্রত্যেকটা বৈশিষ্ট্যের নাম ও মান লিখে দিচ্ছি। দেখ, ক্লিয়ারলি বুঝা যাচ্ছে কি না। কোনটা কোন জিনিস।

javascript
id: 25
class: 9
age: 15
weight: 40

অর্থাৎ অনেকগুলা ছোট ছোট বৈশিষ্ট্য বা প্রপার্টি দিয়ে যদি কোনো একটা জিনিস বা ভেরিয়েবল বুঝানোর দরকার হয়, তখন সিম্পল ভেরিয়েবল বা array দিয়ে কাজ হবে না। সেজন্যই হয়তো তুই যদি একটা মোটর সাইকেলকে বুঝানোর চেষ্টা করিস, তাহলে তার ব্রান্ডের নাম, দাম, কালার, পাওয়ার কত, এইরকম অনেকগুলা তথ্য দিয়ে পুরা মোটর সাইকেলটা বুঝানো হয়।

সো, এইরকম যেকোনো একটা স্পেসিফিক জিনিস ('জিনিস' শব্দের ইংরেজি হচ্ছে object) বা অবজেক্টকে বুঝাইতে হলে অনেক ধরনের ডাটা টাইপ ব্যবহার করে অনেক ধরনের ভেরিয়েবলের মাধ্যমে বুঝাইতে হবে। অর্থাৎ সহজ সমাধান হচ্ছে object ক্রিয়েট করতে হবে।

object ডিক্লেয়ার করার কিছু সিস্টেম আছে। ঠিক যেমন করে তুই একটা ভেরিয়েবল ডিক্লেয়ার করস, ঠিক তেমন করেই একটা object-এর নাম ডিক্লেয়ার করে সমান চিহ্ন দেয়ার পরে { } সেকেন্ড ব্র্যাকেট দিবি। এর আগে ভেরিয়েবল ডিক্লেয়ার করে সমান চিহ্নের পরে তার মান বা ভ্যালু দিতি, আর object ডিক্লেয়ার করার সময় সমান চিহ্নের পরে সেকেন্ড ব্র্যাকেট { } দিবি।

javascript
const student = {};

এইটা হচ্ছে একটা খালি বা empty অবজেক্ট। অর্থাৎ অবজেক্ট হইলেও এইটার ভিতরে কোনো কিছু নাই। সব খালি। মান দিতে হলে এই সেকেন্ড ব্র্যাকেটের ভিতরে তোর মানগুলো দিতে হবে এবং সেকেন্ড ব্র্যাকেটের মধ্যে অবজেক্টের বৈশিষ্ট্যগুলো জোড়ায় জোড়ায় লিখতে হবে। জোড়ায় জোড়ায় লেখার সিস্টেমের মধ্যে দুইটা পার্ট থাকে। একটা হচ্ছে বৈশিষ্ট্যের নাম। এই নামকে key বলে। সেটার নাম লিখবি। অর্থাৎ কী বৈশিষ্ট্য, সেটা বলবি। তারপর কোলন চিহ্ন(😃 দিয়ে সেটার মান লিখবি। যেমন, marks যদি 45 হয়, তাহলে লিখবি marks : 45, এরপর একটা কমা দিবি।

অনেকটা array-এর মতো। প্রত্যেকটা জোড়ার পর কমা দিতে হবে জোড়াগুলোকে আলাদা করার জন্য। আর সবার শেষ জোড়ার পরে যেহেতু আর কোনো জোড়া নাই, তাই তখন আর কমা দেয়া লাগবে না।

তুই যদি স্টুডেন্ট নামে একটা অবজেক্ট ডিক্লেয়ার করতে চাস, সেটাও করতে পারিস নিচের মতো করে

javascript
const student = {
  name: "Motaleb",
  age: 15,
  class: 9,
  isSingle: false,
};

একদম সেইমভাবে তুই ফোনের জন্য একটা অবজেক্ট লিখতে পারবি

javascript
const phone = {
  brand: "apple",
  price: 80000,
  color: "solver",
  version: 20,
};

জুসের জন্য অবজেক্ট বানাতে পারবি

javascript
const juice = {
  name: "Green Mango",
  price: 100,
  sugar: false,
};

গাড়ির জন্য অবজেক্ট লিখতে চাইলে লিখতে পারবি

javascript
const car = {
  brand: "BMW",
  wheels: 4,
  maxSpeed: 100,
  ac: true,
};

অবজেক্টের মধ্যে যেসব প্রপার্টি আমরা লিখি, সেগুলার নাম (key) সাধারণত স্ট্রিং দিয়ে নাম হয়। অনেকটা ভেরিয়েবলের নামের মতো। আর সেগুলার মান (value) কিন্তু যেকোনো কিছু হতে পারে। অর্থাৎ মান স্ট্রিং হতে পারে, সংখ্যা হতে পারে, বুলিয়ান হতে পারে। এমনকি array বা আরেকটা অবজেক্টও হতে পারে। তাই নিচের উদাহরণটা দেখে ফেল।

এখন যদি তুই কোনো একটা subject-এর জন্য object ক্রিয়েট করতে চাস, সেটা তুই এভাবে করতে পারিস

javascript
const subject = {
  name: "biology",
  teacher: "rasheda",
  examDate: "30 dec",
  chapters: ["first", "second", "third"],
  nextExam: {
    name: "Final Exam",
    marks: 100,
  },
};

এই অবজেক্টে তুই একটা জিনিস যদি ভালোমতো খেয়াল করে দেখিস, দেখবি এখানে একটা অবজেক্টের ভিতর আরও একটা অবজেক্ট ক্রিয়েট করা হয়েছে, সেটা হচ্ছে nextExam অবজেক্ট। তার মানে হলো, তুই একটা অবজেক্টের ভিতরে আরও অবজেক্ট তৈরি করতে পারবি। একইভাবে আরেকটা প্রপার্টি আছে chapters নামে, সেটার মান একটা অ্যারে অর্থাৎ কোনো প্রপার্টির মান arrayও হতে পারে।

JavaScript Object Practice:

  1. তুই teacher নামে একটা অবজেক্ট বানা। এইটার মধ্যে টিচারের নাম থাকবে। উনি কোন সাবজেক্ট পড়ান, সেটার নাম থাকবে; স্যারের বয়স, বাসা কোথায়— এই টাইপের পাঁচটা জিনিস থাকবে।

  2. গাছ (tree) নামে একটা object তৈরি কর, যার মধ্যে থাকবে, এইটা কী গাছ, উচ্চতা কেমন, বয়স কত, ফলের নাম কী ইত্যাদি।

  3. তোর আশেপাশে কোনো প্রাণী থাকলে (গরু, বিড়াল, কুকুর, ইঁদুর, তেলাপোকা, মশা, মাছি, পিঁপড়া, টিকটিকি, মানুষ বা অন্য কোনো প্রাণী থাকলে), সেটার জন্য একটা অবজেক্ট লিখে ফেল।

  4. তোর আব্বুর জন্য father নামে একটা অবজেক্ট বানিয়ে ফেল। সেখানে উনার নাম, পেশা, বয়স, সন্তানের সংখ্যা ইত্যাদি তথ্য দিয়ে ফেল।

  5. একটা বাইক(motorbike) নিয়ে object বানা। সেখানে ব্রান্ডের নাম, টায়ারের সংখ্যা, রং, সর্বোচ্চ গতি আর দাম থাকবে।

  6. একটি পাখি (bird) অবজেক্ট তৈরি কর, যেখানে পাখির নাম, রং, খাদ্য ইত্যাদি প্রপার্টি থাকবে।

  7. একটা laptop অবজেক্ট তৈরি কর, যেখানে থাকবে ব্রান্ডের নাম, প্রসেসর, র‍্যাম, দাম, আর ডিসপ্লের সাইজ ইত্যাদি ডাটা থাকবে।

8-2: গার্ডওয়ালা property এর key

গরিবের বাসায় সবাইকে সরাসরি স্বাগত জানানো যায়। চাইলে যে কেউ চলে আসতে পারে, মশা-মাছি, চাঁদের আলো, সবকিছুই চলে আসতে পারে। কিন্তু বড়লোকের বাসায় ঢুকতে গেলে পাঁচটা গেট পার হয়ে দশজন সিকিউরিটি গার্ডের জেরা পার হয়ে তারপর অ্যাক্সেস পেতে হয়।

আবার একেক গেটে একেকভাবে চেক করে।

অবজেক্টও একধরনের বড়লোকি ব্যাপার। তার ভিতরের কোনো ডাটা পেতে চাইলে একটু সিস্টেম করে চেষ্টা-তদবির করতে হয়। যেমন ধর, নিচে person নামে একটা অবজেক্ট আছে। এইটার কোনো প্রোপার্টি অ্যাক্সেস করতে চাইলে কী করতে হবে?

জাস্ট অবজেক্টের নামের পরে ডট (.) চিহ্ন দিয়ে এবং প্রোপার্টির নাম ব্যবহার করে ভ্যালু অ্যাক্সেস করতে পারবি।

javascript
const person = {
  name: "sodor uddain",
  age: 25,
  profession: "developer",
  salary: 25000,
  married: true,
};

console.log(person.profession);

Output: developer;

এইভাবে অবজেক্টের নামের পর ডট চিহ্ন দেয়ার পর প্রোপার্টি এর নাম (key) দেয়াকে বলে ডট নোটেশন।

ডট নোটেশনের কাজগুলা সবই ব্র্যাকেট নোটেশন দিয়ে করা যায়। তবে কিছু কিছু স্পেশাল কেইস আছে, যেগুলার মধ্যে ডট নোটেশন ইউজ করা যায় না। তখন আরেকটা ডিফারেন্ট সিস্টেম করতে হয়।

যেমন, প্রোপার্টির নামের মধ্যে স্পেস বা বিশেষ চিহ্ন ব্যবহার করে ডিক্লেয়ার করা হয়, তখন সেটাকে কোটেশনের মধ্যে রাখতে হয়। এই সকল ক্ষেত্রে Bracket notation ব্যবহার করা হয়।

ব্র্যাকেট নোটেশন বলতে বুঝায় অবজেক্টের নামের পর ডট চিহ্ন না দিয়ে একটা ব্র্যাকেট দিবি। তারপর সেটার মধ্যে স্ট্রিং হিসেবে প্রোপার্টির নাম (key) লিখে দিবি। নিচে দুইটা প্রোপার্টির মান এইভাবে অ্যাক্সেস করা হইছে।

javascript
const person = {
  name: "sodor uddain",
  age: 25,
  profession: "developer",
  salary: 25000,
  married: true,
  "fav places": ["bandarban", "saintmartin", "kuakata"],
};

console.log(person["married"]);
console.log(person["fav places"]);

Output: true[("bandarban", "saintmartin", "kuakata")];

BracketNotation ব্যবহার করতে হলে প্রোপার্টির নামকে সিঙ্গেল কোটেশন বা ডাবল কোটেশনের মধ্যে রাখতে হবে। এ ছাড়া যখন প্রোপার্টির নাম একটি ভেরিয়েবলের মধ্যে থাকে, তখনও bracketnotation ব্যবহার করা হয়।

javascript
const propertyName = "profession";
console.log(person[propertyName]);

Output: developer;

যখন প্রোপার্টির নামটি একটি সাধারণ স্ট্রিং এবং বিশেষ কোনো চিহ্ন বা স্পেস থাকে না, তখন dot notation ব্যবহার করা সহজ এবং সুবিধাজনক। অন্যদিকে, যখন প্রোপার্টির নামটি বিশেষ চিহ্ন, স্পেস, বা একটি ভেরিয়েবলের মধ্যে থাকে, তখন bracket notation ব্যবহার করতে হয়।

প্রোপার্টির মান বের করতে পারলে খুব সহজেই সেটার মান চেইঞ্জ করতে পারবি। জাস্ট বামপাশে ডট নোটেশন বা ব্র্যাকেট নোটেশন দিয়ে প্রোপার্টির মান অ্যাক্সেস করার মতো করে লিখবি। তারপর ডানপাশে ভেরিয়েবল সেট করার মতো করে সমান চিহ্ন দিয়ে নতুন মান বসিয়ে দিবি। তাহলেই হবে।

javascript
const cricketer = {
  position: 4,
  specialty: "batter",
  age: 24,
  runs: 8000,
};

console.log(cricketer.position);
console.log(cricketer["runs"]);

cricketer.position = 1;
cricketer["runs"] = 9000;

console.log(cricketer["position"]);
console.log(cricketer.runs);

Output: 4;
8000;
1;
9000;

এখন থেকে যেমন দরকার, তেমনে অবজেক্টের প্রোপার্টির মান (value) অ্যাক্সেস করতে পারবি, আবার চেইঞ্জও করতে পারবি।

ঘরের ভিতর ঘর মশা আমার পর

একটা অবজেক্টের প্রোপার্টির মান তুই বের করতে পারস। তবে অবজেক্টের কোনো প্রোপার্টির মান যদি আরেকটা অবজেক্ট হয়, তাহলে সেটার প্রোপার্টির মান কীভাবে বের করবি?

কিছুই না। খুবই সিম্পলভাবে ধাপে ধাপে চিন্তা করবি। যেমন নিচের অবজেক্ট

javascript
const college = {
  name: 'vnc',
  class: ['11', '12'],
  events: ['science fair', 'bijoy dibos', '21 feb'],
  unique: {
    color: 'blue',
    result: {
      gpa: 5,
      merit: 'top'
    }
  }
};

console.log(college.unique.color);
console.log(college.unique.result.gpa);
console.log(college.events[2]);

Output:
blue
5
21 feb

এইবার একটু ধাপে ধাপে চিন্তা কর। প্রথমে ওপরের অবজেক্টের মধ্যে তুই যদি college.unique লিখস, তাহলে সেটার আউটপুট কী দিবে? আউটপুট কিন্তু একটা অবজেক্ট। এখন তুই নরমালভাবে চিন্তা কর, college.unique পুরাটা একটা অবজেক্ট। সেটার মধ্যে তুই color নামক একটা প্রোপার্টির মান বের করতে চাস। অর্থাৎ college.unique একটা অবজেক্ট, সেটার মধ্যে color নামক প্রোপার্টির মান বের করতে চাইলে সেটার নামের পর ডট চিহ্ন দিয়ে color লিখবি। সো, আগে লিখছিলি college.unique, এখন এইটার পর ডট দিয়ে color লিখবি, তখন college.unique.color হবে। আর তখন আউটপুট হিসেবে blue পাবি।

একটু আশেপাশে তাকালে দেখবি college.unique-এর আরেকটা প্রোপার্টি আছে। যেটার নাম result। এখন তুই যদি সেই college.unique-এর মধ্যে result নামক প্রোপার্টির মান বের করতে চাস, তাহলে এইটার নামের পর ডট দিয়ে result লিখবি। সো, আগে লিখছিলি college.unique, এখন এইটার পর ডট দিয়ে রেজাল্ট লিখবি, তখন college.unique.result হবে।

কপালের কী খেলা। এই resultও একটা অবজেক্ট। এখন তুই এইটার মধ্যে যদি gpa-এর মান পেতে চাস, তাহলে college.unique.result-এর পর ডট দিয়ে gpa লিখবি। তখন হবে college.unique.result.gpa, আর তখন আউটপুট হিসেবে পাবি 5।

সো, যত ভিতরেই মান থাকুক না কেন, তুই চাইলে দরকার অনুসারে ডট নোটেশন বা ব্র্যাকেট নোটেশন দিয়ে ভিতরে যেতে থাকবি, আর যেটার মান দরকার, সেটা খুঁজে বের করে ফেলতে পারবি।

ওপরের উদাহরণে college অবজেক্টের মধ্যে events নামে একটা প্রোপার্টি আছে। যেটার মান একটা array। এখন তোর যদি মনে হয়, সেই array-এর 2 ইনডেক্সের উপাদান দরকার, তাহলে জাস্ট array পাওয়ার জন্য college.events লিখবি। তারপর array পেয়ে গেলে সেটার পর থার্ড ব্র্যাকেট দিয়ে ইনডেক্সের মান দিয়ে দিবি নিচের মতো করে, তাহলেই হবে।

JavaScript Object Property Practice:

  1. তুই player অবজেক্ট তৈরি করবি। নাম, বয়স, স্পোর্টস, টিম ইত্যাদি প্রোপার্টি থাকবে। তারপর সেই অবজেক্ট থেকে dot notation দিয়ে তার টিমের নাম console কর।

  2. একটা laptop অবজেক্ট তৈরি কর। তার brand, price, hardDisc, ram, screenSize ইত্যাদি প্রোপার্টি থাকবে। dot notation দিয়ে screenSize বের করে দেখ।

  3. তোর একটা প্রিয় জায়গা আছে, যার নাম favPlace। তার মধ্যে কিছু তথ্য আছে। যেমন, name: "Cox's Bazar", distance: "400km", আর popularity: "high"। bracket notation দিয়ে popularity প্রোপার্টি console log কর।

  4. তুই একটা phone অবজেক্ট বানাস। সেখানে brand, color, price প্রোপার্টি থাকে। ব্রান্ড দিস Nokia, কালার black আর দাম 5000। ব্র্যাকেট নোটেশন দিয়ে দাম বের কর।

  5. একটা library অবজেক্ট তৈরি কর। তার মধ্যে name Public Library, location Dhaka আর books: 5000 প্রোপার্টি থাকবে। dot notation দিয়ে location বের কর।

  6. একটা movie অবজেক্ট বানা। যার title Inception, director Nolan, rating 9। bracket notation দিয়ে rating প্রোপার্টি বের কর।

  7. একটা college অবজেক্ট বানা। যার নাম ndc, স্থাপিত (established) 1949, গ্রুপ (groups) ['Science', 'Arts', 'Commerce']। এইবার তোর কাজ হবে সেকেন্ড groups-এর মান অর্থাৎ 1 ইনডেক্সের মান বের কর।

  8. একটা family অবজেক্ট বানা। যার মধ্যে একটা প্রোপার্টি হবে father সেটার মানও আরেকটা অবজেক্ট এবং ফাদারের মধ্যে তোর আব্বুর নাম, বয়স এবং পেশা (profession) থাকবে। একইভাবে family অবজেক্টে mother নামে আরেকটা প্রোপার্টি থাকবে, সেই প্রোপার্টির মানও আরেকটা অবজেক্ট। আর mother-এর অবজেক্টের মধ্যে তোর আম্মুর নাম, বয়স আর পেশা থাকবে। এখন তোর কাজ হচ্ছে, mother-এর age প্রোপার্টি বের কর। তারপর তোর আব্বুর age-এর মান বের কর। তারপর এই দুইটা age-এর যোগফল বের করে সেটা আউটপুট হিসেবে দেখা।

8-3: অবজেক্টের তালা-চাবি

অবজেক্টের মধ্যে কী থাকে? থাকে প্রোপার্টি। প্রোপার্টিগুলার মধ্যে কী থাকে? থাকে দুইটা জিনিস– প্রোপার্টির নাম আর মান। প্রোপার্টির নামকে বলে key, আর প্রোপার্টির মানকে বলে value।

এখন কারো যদি মনে হয়, আমার একটা অবজেক্টের সবগুলা প্রোপার্টির নাম দরকার অর্থাৎ অবজেক্টের মধ্যে যতগুলা প্রোপার্টির key আছে, সবগুলা দরকার, তখন সে Object.keys() ইউজ করতে পারে।

সব কি (Keys)

Object.keys ইউজ করার সিস্টেম হচ্ছে, ডাইরেক্ট Object.keys লিখে ব্র্যাকেটের ভিতরে অবজেক্টের নাম দিয়ে দিবি। তাহলেই সে রিটার্ন হিসেবে অবজেক্টের সবগুলা key একটা অ্যারের মধ্যে রেখে সেই অ্যারে রিটার্ন করে দিবে।

javascript
const computer = {
  brand: "lenovo",
  price: 35000,
  processor: "intel",
  ssd: "512gb",
};

const keys = Object.keys(computer);
console.log(keys);

Output: ["brand", "price", "processor", "ssd"];

এইটা অনেক কাজে লাগে। বিশেষ করে, আমি যদি কোনো কারণে অবজেক্টের সব প্রোপার্টির ওপরে লুপ চালাতে যাই। যদিও অবজেক্টের সব প্রোপার্টির ওপরে লুপ চালানোর আলাদা সিম্পল সিস্টেমও আছে। সেটা একটু পরে বলতেছি।

সব মান (Values)

Object.values ইউজ করার সিস্টেম হচ্ছে, ডাইরেক্ট Object.values লিখে ব্র্যাকেটের ভিতরে অবজেক্টের নাম দিয়ে দিবি। তাহলেই সে রিটার্ন হিসেবে অবজেক্টের সবগুলা প্রোপার্টির মান (value) একটা অ্যারের মধ্যে রেখে সেই অ্যারে রিটার্ন করে দিবে।

javascript
const values = Object.values(computer);
console.log(values);

Output: ["lenovo", 35000, "intel", "512gb"];

প্রোপার্টি আছে কি না, চেক কর

মাঝেমধ্যে দরকার পড়তে পারে। কোনো একটা অবজেক্টের মধ্যে স্পেসিফিক একটা প্রোপার্টি আছে কি না, সেটা চেক করার একটা সিস্টেম হবে, Object.keys দিয়ে সবগুলা প্রোপার্টির নাম নিয়ে আসবি। তারপর তুই একটা অ্যারে পাবি, যেই অ্যারের মধ্যে সব প্রোপার্টির নাম আছে। আর এইটা যেহেতু একটা অ্যারে, তাই খুব সহজেই এইটার মধ্যে কোনো প্রোপার্টি আছে কি না, চেক করতে পারবি অ্যারের পর includes লিখে।

javascript
const profile = {
  name: "Rahim",
  age: 28,
  city: "Dhaka",
};

const profileKeys = Object.keys(profile);
const hasName = profileKeys.includes("name");
console.log(hasName);

Output: true;

তবে কোনো একটা অবজেক্টের মধ্যে কোনো একটা প্রোপার্টি আছে কি না, সেটা চেক করার সিম্পল একটা সিস্টেম আছে। শর্ত হিসেবে বেশির ভাগ সময় ইউজ করা হয়। খুবই সিম্পল। জাস্ট if-এর পরে শর্তের মধ্যে প্রোপার্টির নাম লিখবি, তারপর in লিখে অবজেক্টের নাম লিখে দিবি। তাহলে সে চেক করবে, ওই নামের প্রোপার্টি অবজেক্টের মধ্যে আছে কি না।

javascript
if ( "email" in profile) {
  console.log("email exists");
} else {
  console.log("No email. No Spam.");
}

Output: No email. No Spam.

ওপরের profile অবজেক্টের মধ্যে email নামে কোনো প্রোপার্টি নাই, তাই আমরা else-এর আউটপুট পেয়েছি।

আরেকটা সিস্টেম আছে। একদম অবজেক্টের নিজস্ব প্রোপার্টি (তার বাপ-দাদার প্রোপার্টি থাকলে সেটাকে ইগনোর করে চেক করবে), এইটা ফিউচারে আরও বিস্তারিত জানতে পারবি। তবে সেটা হচ্ছে, অবজেক্টের নাম লিখে তারপর hasOwnProperty মানে তার নিজস্ব প্রোপার্টি কি না। যদি নিজস্ব প্রোপার্টি হয়, তাহলে true বলবে। আর যদি তার বা তার উত্তরাধিকার সূত্রে (এইটা নিয়ে পরে বলব) পাওয়া প্রোপার্টিও হয়ে থাকে, তাহলেও বলবে false।

এখন উত্তরাধিকারের ক্যাচালে যাওয়ার দরকার নাই। জাস্ট সিম্পলভাবে চিন্তা কর। একদম অবজেক্টের মধ্যে থাকলে true বলবে, আর না থাকলে false বলবে—

javascript
 if (profile.hasOwnProperty("email")) {
  console.log("Email niye boroloki dekhai");
} else {
  console.log("Email Chara jibon");
}

Output: Email Chara jibon

প্রোপার্টির নাম (key) আছে কি না, চেক করার পাশাপাশি মাঝেমধ্যে দরকার পড়ে মান চেক করার। যেমন—

javascript
if (profile.city === "Dhaka") {
    console.log("Jam er sohor Dhaka.");
}
else {
    console.log("Aram sob gram e.");
}

Output: Jam er sohor Dhaka.

জোড়ায় জোড়ায় entries কর

কখনো রেস্টুরেন্টে যেতে লজ্জা পাবি। দেখবি, সব জোড়ায় জোড়ায় আসতেছে বা জোড়ায় জোড়ায় যাইতেছে। তুই হয়তো জিন্দেগিতে জোড়া হইতে পারবি না। তবে অবজেক্টের প্রতিটা প্রোপার্টি এবং তার মানকে জোড়ায় জোড়ায় হিসেবে দেখতে পারবি। জাস্ট object.entries লিখে তারপর দুইটা ব্র্যাকেটের ভিতরে অবজেক্টের নাম লিখে দিবি নিচের মতো করে। তাহলে অবজেক্টের সব প্রোপার্টির নাম আর মান জোড়ায় জোড়ায় পেয়ে যাবি।

javascript
const person = {
  name: "Alice",
  age: 25,
  country: "Bangladesh",
};

const entries = Object.entries(person);
console.log(entries);

Output: [
  ["name", "Alice"],
  ["age", 25],
  ["country", "Bangladesh"],
];

এই আউটপুটে তুই দেখতে পাবি, প্রতিটা প্রোপার্টির নাম এবং তার মান একটা অ্যারের ভেতরে জোড়া হিসেবে এসেছে। একে বলা হয় array of arrays বা two-dimensional array।

অবজেক্টের ওপরে লুপ

মাঝেমধ্যে অবজেক্টের ওপরে লুপ চালানোর দরকার পড়ে। এইটা কয়েকভাবে করা যায়। তারমধ্যে সবচেয়ে কমন হচ্ছে for…in লুপ।

এই for in লুপ জাস্ট for of লুপের খালাতো ভাই। জাস্ট অ্যারের উপাদানগুলোর ওপরে লুপ চালানোর জন্য for of চালাই। আর অবজেক্টের ওপরে লুপ চালানো জন্য for in ইউজ করবে। লুপ করলে লুপের মধ্যে লুপ ভেরিয়েবল হিসেবে প্রোপার্টির key হিসেবে প্রোপার্টির নাম দিবে। তারপর প্রোপার্টির মান বা ভ্যালু পাওয়ার জন্য অবজেক্টের পর ব্র্যাকেট দিয়ে key বসিয়ে দিলেই প্রত্যেকটা প্রোপার্টির মানও পেয়ে যাবি।

নিচের কোডটা দেখে রাখ।

javascript
const profile = {
    name: "Rahim",
    age: 28,
    city: "Dhaka"
};

for (const key in profile) {
  const value = profile[key];
  console.log(key, value);
}

Output:
name Rahim
age 28
city Dhaka

for in আসার আগে একটা অবজেক্টের সব প্রোপার্টির ওপরে লুপ চালানোর একটা কমন সিস্টেম ছিল Object.keys দিয়ে সব key-গুলাকে নিয়ে আসা। নিয়ে আসলে তো সেটা একটা অ্যারে হয়ে গেল। এরপর একটা অ্যারের ওপরে যেভাবে ফর লুপ বা for of চালানো যায়, সেটা চালিয়ে দেওয়া। আর for of-এর ভিতরে যেহেতু key একটা একটা করে পাওয়া যাবে, তখন key দিয়ে সহজেই প্রোপার্টির মান বা ভ্যালু বের করে ফেলতে পারবি।

javascript
const profile = { name: "Rahim", age: 28, city: "Dhaka" };
const keys = Object.keys(profile);

for (const key of keys) {
  console.log(key, profile[key]);
}

Output:
name Rahim
age 28
city Dhaka

আমি জাস্ট দুইটা সিস্টেমের কথা বলছি। এমন আরও অনেক সিস্টেম আছে অবজেক্টের ওপরে লুপ চালানোর। সেগুলা ধীরে ধীরে শিখবি।

JavaScript Object Keys and Values Practice:

  1. বই নামে একটা অবজেক্ট বানিয়ে ফেল। সেটার মধ্যে বইয়ের নাম, লেখক, দাম ইত্যাদি থাকবে। তারপর অবজেক্টের সব প্রোপার্টি (keys) এবং সব ভ্যালু (values) কনসোল লগ কর।

  2. এই অবজেক্টটিতে চেক কর, author প্রোপার্টি আছে কি না। const article = { title: "Learning JS", category: "Programming" };

  3. তোকে ল্যাপটপ নামের একটা অবজেক্ট দেয়া হলো— const laptop = { brand: "Dell", model: "Inspiron", price: 45000 }; এইবার for...in লুপ চালিয়ে প্রতিটি প্রোপার্টি এবং তার মান প্রিন্ট কর।

  4. একটা phone নামের অবজেক্ট আছে। const phone = { brand: "Samsung", model: "Galaxy S21", price: 85000 }; এইটার জন্য Object.keys ব্যবহার করে for...of লুপ চালিয়ে প্রতিটি প্রোপার্টি এবং তার মান কনসোল লগ কর।

  5. তুই একটা bike অবজেক্ট বানাস, যেখানে brand: "Hero", price: 120000, আর model: "Splendor" প্রোপার্টিগুলো থাকবে। Object.values() মেথড ব্যবহার করে সব ভ্যালুগুলো বের কর।

  6. const books = { book1: "Harry Potter", book2: "The Hobbit", book3: "Game of Thrones" }; এর ওপরে লুপ চালিয়ে সব বইয়ের নাম কনসোল লগ কর।

  7. সংখ্যার একটি অবজেক্ট দিলাম— const numbers = { a: 10, b: 20, c: 30, d: 40 }; এইবার বুদ্ধি খাটিয়ে এই অবজেক্টের সব প্রোপার্টির ভ্যালুগুলোর যোগফল বের কর।

  8. একটা player অবজেক্ট বানা, যেখানে name: "Messi", team: "Argentina", আর goals: 91 থাকবে। Object.values ব্যবহার করে সব ভ্যালু বের কর।

  9. একটা building অবজেক্ট বানা, যার মধ্যে floors: 10, address: {street: "Main Road", city: "Dhaka"}, আর type: "Commercial"। এখন একটা for...in লুপ চালিয়ে সব প্রোপার্টি আর ভ্যালু প্রিন্ট কর।

8-4: Freeze-এ বন্দি অবজেক্ট

অনেকেই পোষ্ট লিখে ডিলিট মারে, কমেন্ট করে ডিলিট মারে, মেসেজ পাঠিয়ে ডিলিট মারে, এমনকি প্রেম-ভালোবাসার প্রপোজ করেও ডিলিট মারে। অবজেক্টের ক্ষেত্রেও এমনটা হতে পারে। হয়তো কোনো একজন আপু বয়স বলে ফেলছে। তারপর ভাবল— ছেলেদের স্যালারি আর মেয়েদের বয়স পাবলিকলি বলে ফেলা ঠিক না।

আপু চাচ্ছেন বয়সটা ডিলিট করতে। কীভাবে ডিলিট করবে? জাস্ট delete লিখবে, তারপর অবজেক্টের নাম লিখে একটা ডট চিহ্ন দিয়ে এরপর যে প্রোপার্টি ডিলিট করতে চায়, সেটার নাম লিখে দিবি, তাহলেই হবে। অনেকটা নিচের মতো করে—

javascript
const person = { name: "Alice", age: 25, country: "Bangladesh" };
delete person.age;
console.log(person);

Output: { name: 'Alice', country: 'Bangladesh' }

এখানে আমরা age প্রোপার্টিটা ডিলিট করেছি। তাই person অবজেক্টে আর age নাই হয়ে গেছে।

Object.freeze()

আবার কিছু কিছু সময় উল্টা বিষয় থাকে। যে প্রোপার্টির মান ডিলিট করা যাবে না, এমনকি কোনো মানও পরিবর্তন করতে দিবে না, নতুন কোনো প্রোপার্টি যোগ করতে দিবে না। এমন কিছু করতে চাইলে অবজেক্টকে ফ্রিজে রেখে দিতে হবে Object.freeze ইউজ করে নিচের মতো। তারপর দেখবি, নতুন প্রোপার্টি যোগ করতে চাইলে যোগ হবে না। কোনো মান চেইঞ্জ করতে চাইলে সেটা চেইঞ্জ হবে না। এমনকি কোনো প্রোপার্টি ডিলিট করতে চাইলে সেটা ডিলিট হবে না।

javascript
const adminUser = {
  username: "admin",
  email: "admin@example.com",
  role: "superadmin"
};

Object.freeze(adminUser);

// Attempt to modify the object
adminUser.role = "user";
adminUser.password = "123456";
delete adminUser.email;

console.log(adminUser);

Output: {username: 'admin', email: 'admin@example.com', role: 'superadmin'}

Seal

অনেক সময় অবজেক্টের প্রোপার্টি ডিলিট করতে বা নতুন প্রোপার্টি যোগ করতে না দিলেও যেসব প্রোপার্টি অলরেডি আছে, সেগুলাকে মোডিফাই করতে দিতে হয়। বিশেষ করে একজন ইউজার যদি থাকে, তাহলে তার ই-মেইল বা নাম চেইঞ্জ করতে না দিলেও তার পাসওয়ার্ড কিন্তু চেইঞ্জ করতে দিতে হয়। সেজন্য freeze ইউজ না করে seal ইউজ করা যেতে পারে।

javascript
const user = {
  username: "johndoe",
  email: "john.doe@example.com",
  password: "oldpassword"
};

Object.seal(user);

// Attempt to modify the object
user.password = "newpassword"; // Allowed
user.age = 30; // adding new property is not allowed
delete user.email; // deleting property is not allowed

console.log(user);

Output: {username: 'johndoe', email: 'john.doe@example.com', password: 'newpassword'}

Seal vs freeze

seal আর ফ্রিজ কাছাকাছি টাইপের জিনিস। হালকা ডিফারেন্স হচ্ছে, seal প্রোপার্টির মান চেইঞ্জ করতে দেয়, আর freeze সেটাও করতে দেয় না।

JavaScript Object Protection Practice:

  1. ধর, তোর একটা headphone অবজেক্ট আছে, যার মধ্যে brand: "Sony", price: 3000, আর color: "red"। Object.freeze() মেথড ব্যবহার করে অবজেক্টটা freeze কর। এরপর আরেকটা নতুন প্রোপার্টি যোগ করতে চেষ্টা কর। দেখ, কাজ করে কি না।

  2. const player = { name: "Messi", goals: 800, club: "Inter Miami" }; Object.freeze() মেথড ব্যবহার করে অবজেক্ট ফ্রিজ কর। তারপর নতুন প্রোপার্টি যোগ করে দেখ, কাজ করে কি না।

  3. const book = { title: "Harry Potter", author: "JK Rowling", pages: 500 }; Object.seal() ব্যবহার করে অবজেক্ট সিল কর। তারপর author প্রোপার্টি চেঞ্জ করে দেখ।

  4. একটা gadget অবজেক্ট বানা, যার মধ্যে name: "iPhone", price: 120000, আর color: "Black" থাকবে। delete ব্যবহার করে price ডিলিট কর।

  5. একটা animal অবজেক্ট বানা, যার মধ্যে name: "Tiger", location: "Sundarban" থাকবে। এখন এমন কিছু কর, যাতে টাইগারের লোকেশন চেইঞ্জ করা না যায়।

  6. const food = { name: "Pizza", price: 500, size: "Large" }; এমন কিছু কর, যাতে food-এর মধ্যে নতুন প্রোপার্টি যোগ করা যাবে না। তবে চাইলে দাম বাড়ানো বা কমানো যাবে।

Released under the MIT License.