Subjects

All subjects Django Java Python React Spring Boot JavaScript PHP
Sign Up Free
Question 8 of 10 · Prototypes and Inheritance
Interview question

What is the difference between Object.freeze(), Object.seal(), and Object.preventExtensions()? Object.freeze(), Object.seal(), और Object.preventExtensions() में क्या अंतर है?

Answer
MethodAdd new properties?Delete properties?Modify existing values?
Object.preventExtensions()NoYesYes
Object.seal()NoNoYes
Object.freeze()NoNoNo
// 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?