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"।

🔒 কপিরাইট সুরক্ষিত কন্টেন্ট 🔒

কপি, স্ক্রিনশট, প্রিন্ট করা সম্পূর্ণ নিষিদ্ধ।