Objects — The King of Data Structures
"Everything is an Object"
জাভাস্ক্রিপ্টে একটা কথা প্রচলিত আছে: "Almost everything is an object." তুমি যদি অবজেক্ট ভালোভাবে বোঝো, তাহলে ডেটা স্ট্রাকচার, এপিআই রেসপন্স হ্যান্ডলিং এবং স্টেট ম্যানেজমেন্ট (React/Redux) তোমার কাছে জলের মতো পরিষ্কার হয়ে যাবে।
এই অধ্যায়ে আমরা অবজেক্টের শুধু ব্যবহার শিখব না, এর DNA (Descriptors & Prototypes) এবং Behavior শিখব।
⭐ ১. Object আসলে কী? (The Dictionary)
অবজেক্ট হলো Key-Value পেয়ারের কালেকশন। একে বাস্তব জীবনের বস্তুর সাথে তুলনা করা যায়। যেমন একটি গাড়ি (Car):
- Properties (Data): color, model, weight
- Methods (Action): start(), stop(), brake()
const user = {
name: "Shagor", // String
age: 29, // Number
isDeveloper: true, // Boolean
skills: ["JS", "React"], // Array
address: { // Nested Object
city: "Dhaka",
zip: 1216
}
};
⭐ ২. Accessing Data: Dot vs Bracket
জুনিয়ররা সবসময় ডট (.) ব্যবহার করে। কিন্তু সিনিয়ররা জানে কখন ব্র্যাকেট ([]) লাগবে।
A) Dot Notation (Simple)
console.log(user.name); // "Shagor"
B) Bracket Notation (Dynamic Power) 🔥
যখন তুমি জানো না কী (Key) দিয়ে খুঁজতে হবে, অথবা কী-এর নাম ভেরিয়েবলে আছে।
const searchKey = "age";
console.log(user[searchKey]); // 29
// Dot দিয়ে এটা সম্ভব না: user.searchKey ❌ (undefined দেবে)
⭐ ৩. Updating & Mutability (Reference Trap)
অবজেক্ট Reference Type। এর মানে ভেরিয়েবলের ভেতর পুরো অবজেক্ট থাকে না, থাকে মেমোরির ঠিকানা (Address)।
const person1 = { name: "Rahim" };
const person2 = person1; // ঠিকানা কপি হলো
person2.name = "Karim";
console.log(person1.name); // "Karim" 😱
Decision:
কখনোই অবজেক্ট সরাসরি কপি করবে না (=). সবসময় Clone করবে।
⭐ ৪. Immutability & Copying Objects (Senior Must-Know)
রিয়েক্ট বা বড় অ্যাপ্লিকেশনে আমরা অরিজিনাল ডেটা বদলাই না, কপি করে নতুন ভার্সন বানাই।
A) Shallow Copy (Spread Operator) - কাজের জিনিস
উপরের লেভেল কপি করে, কিন্তু ভেতরের নেস্টেড অবজেক্ট রেফারেন্স থেকে যায়।
const copyUser = { ...user };
B) Deep Copy (The Real Clone) 🧬
ভেতরের সব কিছুসহ নতুন কপি তৈরি করে।
// Old Way (Slow & Data Loss risk)
const deepOld = JSON.parse(JSON.stringify(user));
// ✅ Modern Way (Fast & Safe)
const deepNew = structuredClone(user);
⭐ ৫. Destructuring & Aliasing (Clean Code)
অবজেক্ট থেকে ভ্যালু বের করার স্মার্ট উপায়।
const config = {
url: "https://api.com",
timeout: 5000,
active: true
};
// Basic
const { url, timeout } = config;
// Aliasing (নাম পরিবর্তন করে বের করা)
const { url: apiUrl } = config; // এখন variable এর নাম apiUrl
// Default Value (যদি না থাকে)
const { port = 8080 } = config; // port হবে 8080
⭐ ৬. Optional Chaining (?.) — The Life Saver
নেস্টেড অবজেক্ট এক্সেস করতে গিয়ে কোড ক্র্যাশ খাওয়া থেকে বাঁচায়।
const user = { name: "X" }; // address নেই
// ❌ Crash করবে
// console.log(user.address.city);
// ✅ undefined রিটার্ন করবে, কিন্তু ক্র্যাশ করবে না
console.log(user.address?.city);
⭐ ৭. Looping & Transformation Methods
for...in লুপ একটু স্লো এবং প্রোটোটাইপ চেইন থেকেও প্রপার্টি নিয়ে আসে। মডার্ন উপায়গুলো দেখো:
- Object.keys(obj): সব কী (Key) এর অ্যারে দেয়
- Object.values(obj): সব ভ্যালুর অ্যারে দেয়
- Object.entries(obj): [key, value] পেয়ার দেয়
- Object.fromEntries(arr): অ্যারেকে আবার অবজেক্ট বানায়
Example: অবজেক্টের সব ভ্যালু ডাবল করা
const scores = { math: 40, eng: 50 };
const doubleScores = Object.fromEntries(
Object.entries(scores).map(([key, val]) => [key, val * 2])
);
console.log(doubleScores); // { math: 80, eng: 100 }
⭐ ৮. this Keyword in Objects (Warning ⚠️)
অবজেক্টের মেথড লেখার সময় Arrow Function এড়িয়ে চলবে।
const hero = {
name: "Batman",
// ✅ Correct Method
sayHi() {
console.log(`I am ${this.name}`);
},
// ❌ Wrong (Arrow function has no 'this')
sayBye: () => {
console.log(`Bye ${this.name}`); // this.name হবে undefined
}
};
⭐ ৯. Advanced Control: Freeze & Seal
তুমি চাইলে অবজেক্টকে লক করে দিতে পারো।
- Object.freeze(obj): একদম পাথর। না আপডেট করা যাবে, না ডিলেট, না অ্যাড। (Const এর চেয়েও পাওয়ারফুল)
- Object.seal(obj): নতুন অ্যাড বা ডিলেট করা যাবে না, কিন্তু যা আছে তা আপডেট করা যাবে
⭐ ১০. Property Descriptors (Under the Hood) 🕵️♂️
প্রতিটি প্রপার্টি শুধু key: value না, তার পেছনে কিছু গোপন সুইচ থাকে।
const profile = { name: "Hidden" };
Object.defineProperty(profile, "id", {
value: 101,
writable: false, // চেঞ্জ করা যাবে না
enumerable: false, // লুপে বা console.log এ দেখা যাবে না
configurable: false // ডিলিট করা যাবে না
});
console.log(profile.id); // 101
profile.id = 200; // কাজ হবে না (Strict mode এ Error দেবে)
🧠 ১১. Senior Level Challenges (Practical)
🔥 Problem 1: ইমিউটেবল উপায়ে প্রপার্টি রিমুভ করা
const person = { name: "A", age: 20, pass: "secret" };
// password বাদে বাকি সব newPerson এ থাকবে
const { pass, ...newPerson } = person;
console.log(newPerson); // { name: "A", age: 20 }
🔥 Problem 2: অবজেক্ট এম্পটি কিনা চেক করা
const isEmpty = (obj) => Object.keys(obj).length === 0;
🔥 Problem 3: Dynamic Key (Computed Properties)
const keyName = "status";
const value = "active";
const dynamicObj = {
[keyName]: value // { status: "active" }
};
🚀 অধ্যায় ৬ সারাংশ (Checklist)
আমরা শিখলাম:
- ✓ Access: ডট নোটেশন ফিক্সড, ব্র্যাকেট নোটেশন ডাইনামিক
- ✓ Safety: ?. (Optional Chaining) ক্র্যাশ ঠেকায়
- ✓ Copy: structuredClone দিয়ে ডিপ কপি
- ✓ Looping: Object.entries সবচেয়ে পাওয়ারফুল
- ✓ Methods: অবজেক্টের মেথডে Arrow function ব্যবহার করা যাবে না
- ✓ Internal: freeze এবং descriptors দিয়ে অবজেক্ট কন্ট্রোল করা
Next Step: আমরা ডেটা টাইপগুলোর বস (Array & Object) শিখে ফেলেছি। কিন্তু এই ডেটাগুলো নিয়ে কাজ করতে গিয়ে স্ট্রিং (Text) ম্যানিপুলেশন প্রচুর দরকার হয়। পরের অধ্যায়: "Mastering Strings & Template Literals"।