Interview question
What is the difference between Object.freeze(), Object.seal(), and Object.preventExtensions()? Object.freeze(), Object.seal(), और Object.preventExtensions() में क्या अंतर है?
Answer
| Method | Add new properties? | Delete properties? | Modify existing values? |
|---|---|---|---|
| Object.preventExtensions() | No | Yes | Yes |
| Object.seal() | No | No | Yes |
| Object.freeze() | No | No | No |
// Object.preventExtensions - blocks NEW properties only
const obj1 = { a: 1 };
Object.preventExtensions(obj1);
obj1.b = 2; // silently fails (or throws in strict mode)
obj1.a = 10; // works - existing properties can still change
delete obj1.a; // works - deletion still allowed
console.log(obj1); // {} - a was deleted successfully
// Object.seal - prevents adding/removing, but allows modifying existing values
const obj2 = { a: 1 };
Object.seal(obj2);
obj2.b = 2; // fails - can't add
obj2.a = 100; // works - can modify
delete obj2.a; // fails - can't delete
console.log(obj2); // { a: 100 }
console.log(Object.isSealed(obj2)); // true
// Object.freeze - most restrictive, object becomes fully immutable (shallow)
const obj3 = { a: 1, nested: { b: 2 } };
Object.freeze(obj3);
obj3.a = 100; // fails silently
obj3.c = 'new'; // fails silently
delete obj3.a; // fails silently
console.log(obj3.a); // 1 - unchanged
console.log(Object.isFrozen(obj3)); // true
// IMPORTANT: freeze is SHALLOW - nested objects are still mutable
obj3.nested.b = 999; // this WORKS, freeze doesn't apply recursively
console.log(obj3.nested.b); // 999
// Deep freeze helper
function deepFreeze(obj) {
Object.getOwnPropertyNames(obj).forEach(key => {
const value = obj[key];
if (value && typeof value === 'object') {
deepFreeze(value);
}
});
return Object.freeze(obj);
}| Method | नए properties? | Delete? | Existing values modify? |
|---|---|---|---|
| Object.preventExtensions() | नहीं | हाँ | हाँ |
| Object.seal() | नहीं | नहीं | हाँ |
| Object.freeze() | नहीं | नहीं | नहीं |
// Object.preventExtensions - सिर्फ नए properties रोकता है
const obj1 = { a: 1 };
Object.preventExtensions(obj1);
obj1.b = 2; // silently fail
obj1.a = 10; // काम करता है
delete obj1.a; // काम करता है
// Object.seal - add/remove नहीं, modify हाँ
const obj2 = { a: 1 };
Object.seal(obj2);
obj2.b = 2; // fail
obj2.a = 100; // काम करता है
delete obj2.a; // fail
console.log(obj2); // { a: 100 }
// Object.freeze - सबसे restrictive
const obj3 = { a: 1, nested: { b: 2 } };
Object.freeze(obj3);
obj3.a = 100; // fail
delete obj3.a; // fail
console.log(obj3.a); // 1
// ज़रूरी: freeze shallow है - nested objects अभी भी mutable हैं
obj3.nested.b = 999; // यह काम करता है
console.log(obj3.nested.b); // 999
// Deep freeze helper
function deepFreeze(obj) {
Object.getOwnPropertyNames(obj).forEach(key => {
const value = obj[key];
if (value && typeof value === 'object') deepFreeze(value);
});
return Object.freeze(obj);
}Was this answer clear?