J

JavaScript Handbook

Clean • Professional

JavaScript Object Protection - Freeze, Seal & Prevent

2 minute

Object Protection in JavaScript

In JavaScript, objects are dynamic by default — meaning their properties can be added, changed, or deleted at any time. However, in some cases (like configurations, constants, or sensitive data), you might want to protect objects from modification.

learn code with durgesh images

JavaScript provides several built-in methods for object protection, allowing you to control how mutable (changeable) an object is.

Levels of Object Protection

Protection LevelMethodCan Add Properties?Can Modify Existing?Can Delete Properties?
Non-extensibleObject.preventExtensions()NoYesYes
SealedObject.seal()NoYesNo
FrozenObject.freeze()NoNoNo

Object.preventExtensions()

Prevents adding new properties to an object, but existing ones can still be modified or deleted.

Example:

const user = { name: "John" };
Object.preventExtensions(user);

user.age = 30; //  Not allowed
user.name = "Jane"; //  Allowed
delete user.name; //  Allowed

console.log(user); // {}
console.log(Object.isExtensible(user)); // false

Object.seal()

Prevents adding or deleting properties, but allows modifying existing values.

All properties become non-configurable.

Example:

const person = { name: "John" };
Object.seal(person);

person.age = 25; //  Can't add
person.name = "Jane"; //  Can modify
delete person.name; //  Can't delete

console.log(person); // { name: "Jane" }
console.log(Object.isSealed(person)); // true

Object.freeze()

Highest level of protection.

Prevents:

  • Adding properties
  • Deleting properties
  • Modifying property values

Example:

const config = { appName: "MyApp" };
Object.freeze(config);

config.appName = "NewApp"; //  No effect
config.version = 1.0; //  No effect
delete config.appName; //  No effect

console.log(config); // { appName: "MyApp" }
console.log(Object.isFrozen(config)); // true

Deep Freeze (for Nested Objects)

Object.freeze() only freezes the top-level object.

To protect nested objects, you must recursively freeze them.

Example:

function deepFreeze(obj) {
  Object.freeze(obj);
  for (let key in obj) {
    if (typeof obj[key] === "object" && obj[key] !== null) {
      deepFreeze(obj[key]);
    }
  }
  return obj;
}

const settings = {
  ui: { theme: "dark" },
  version: 1
};

deepFreeze(settings);
settings.ui.theme = "light"; //  No effect
console.log(settings.ui.theme); // "dark"

Checking Protection Status

Check TypeMethodReturns
Is Extensible?Object.isExtensible(obj)true / false
Is Sealed?Object.isSealed(obj)true / false
Is Frozen?Object.isFrozen(obj)true / false

Practical Example (Comparison)

const obj = { a: 1 };

// preventExtensions
Object.preventExtensions(obj);
obj.b = 2; // 

// seal
Object.seal(obj);
delete obj.a; // 
obj.a = 10; // 

// freeze
Object.freeze(obj);
obj.a = 5; // 

Real-World Use Cases

ScenarioProtection MethodReason
Configuration constantsObject.freeze()Prevent accidental changes
API Response objectsObject.seal()Prevent structure modification
Framework settingsObject.preventExtensions()Limit expansion of object
Immutable State (React, Redux)deepFreeze()Ensure predictable, pure updates


Article 0 of 0