Q34. What is the difference between Object.freeze(), Object.seal(), and Object.preventExtensions()?
তিনটি method object-এর নমনীয়তা কতটা কমায় — ভেতরের প্রপার্টি থেকে নতুন প্রপার্টি যোগ করা পর্যন্ত।
তিনটি method-ই object-কে পরিবর্তনের বিরুদ্ধে কিছুটা সুরক্ষিত করে, কিন্তু কতটা সুরক্ষা করে সেটা আলাদা। সহজ করে বলতে গেলে — preventExtensions নতুন প্রপার্টি আর ডিলিট বন্ধ করে, seal ডিলিটও বন্ধ করে, আর freeze ভেতরের মান বদলানোও বন্ধ করে দেয়।
const user = { name: "Rahim", age: 25 };
Object.preventExtensions(user);
user.role = "admin"; // নতুন প্রপার্টি — যোগ হবে না
console.log(user.role); // undefined
user.name = "Karim"; // বর্তমান প্রপার্টি বদলাতে পারবে
console.log(user.name); // "Karim"
// delete user.name; // বন্ধ — কিন্তু delete চালালে false ফেরত দেয়ধাপে ধাপে — preventExtensions চালানোর পরে user নতুন কোনো প্রপার্টি রাখতে রাজি নয়, তাই user.role = "admin" লিখলেও সেটা যোগ হয় না এবং পড়লে undefined মেলে। কিন্তু আগে থেকে থাকা name প্রপার্টি বদলানোর ওপর কোনো বাধা নেই।
const user = Object.seal({ name: "Rahim", age: 25 });
user.name = "Karim"; // ✅ বদলানো যায়
user.role = "admin"; // ❌ নতুন প্রপার্টি যোগ হয় না
// delete user.name; // ❌ ডিলিটও করা যায় না
console.log(user); // { name: "Karim", age: 25 }const user = Object.freeze({ name: "Rahim", age: 25 });
user.name = "Karim"; // ❌ নীরবে ব্যর্থ হয়
console.log(user.name); // "Rahim" — আগের মানই আছে
user.role = "admin"; // ❌ যোগ হয় না
// delete user.name; // ❌ ডিলিট হয় না
console.log(Object.isFrozen(user)); // truefreeze ব্যবহারের সময় একটা গুরুত্বপূর্ণ বিষয় জানা দরকার — strict mode-এ বদলানোর চেষ্টা করলে error পড়ে, আর সাধারণ মোডে নীরবে ব্যর্থ হয়। তাই const দিয়ে বাঁধা object-এ freeze করলে ভুল ধরা পড়ে।
"use strict";
const user = Object.freeze({ name: "Rahim" });
user.name = "Karim"; // TypeError: Cannot assign to read only property// shallow — ভেতরের nested object বদলানো যায়
const settings = Object.freeze({
theme: "dark",
nested: { count: 1 },
});
settings.theme = "light"; // ❌ বদলায় না
settings.nested.count = 2; // ✅ বদলায়! freeze শুধু এক স্তরের
console.log(settings.nested.count); // 2| Method | প্রপার্টি বদলানো | প্রপার্টি যোগ | প্রপার্টি ডিলিট | ভেতরের nested |
|---|---|---|---|---|
preventExtensions | যায় | যায় না | যায় না | বদলায় |
seal | যায় | যায় না | যায় না | বদলায় |
freeze | যায় না | যায় না | যায় না | বদলায় |
Object.freeze করলে সেই object-ই Object.prototype-এর বাইরে immutable হয়ে যায়, তাই এটি const-এর চেয়েও কঠোর — const শুধু reference বদলাতে বাঁধে, freeze প্রপার্টিও বদলাতে বাঁধে। চেক করতে Object.isFrozen, Object.isSealed, Object.isExtensible ব্যবহার করুন।