Object preventExtension vs seal vs freeze
2019-10-11
ECMAScript 5 introduced new Object
methods to Javascript. Among them preventExtensions
, seal
, freeze
methods will be compared to each other.
preventExtensions
An object called by this method can't have any new properties being added.
Example
let person = {
name: "Agustin",
age: 27,
};
Object.preventExtensions(person);
Object.isExtensible(person); // return false
person.surname = "Ramirez";
console.log(person.surname); // return undefined
person.name = "Maria";
console.log(person); // return { name: "Maria", age: 27 }
delete person.age;
console.log(person); // return { name: "Maria" }
seal
An object called by this method can not have any new properties being added or current properties deleted.
Example
let person = {
name: "Agustin",
age: 27,
};
Object.seal(person);
Object.isSealed(person); // return true
// In strict mode this will throw a `TypeError`
person.foo = "something";
console.log(person.foo); // return undefined
person.name = "Maria";
console.log(person); // return { name: "Maria", age: 27 }
delete person.age;
console.log(person); // return { name: "Maria", age: 27 }
Object.defineProperty(person, "name", {
get: () => "Juan",
}); // Throw TypeError
console.log(person); // return { name: "Maria", age: 27 }
freeze
An object called by this method can not have any further changes done to it.
Example
let person = {
name: "Agustin",
age: 27,
};
Object.freeze(person);
Object.isFrozen(person); // return true
person.name = "Maria";
console.log(person); // return { name: "Agustin", age: 27 }
shallow only
All of these methods only work on object properties shallowly, meaning that just work with the direct property references.
let person = {
name: "Agustin", // Prevented, Sealed and Frozen
age: 27, // Prevented, Sealed and Frozen
address: {
// Un-prevented, un-sealed and un-frozen
country: "Argentina", // Un-prevented, un-sealed and un-frozen
city: "Corrientes", // Un-prevented, un-sealed and un-frozen
},
};
Feature matrix
Feature | default | preventExtensions | seal | freeze |
---|---|---|---|---|
add new properties | ✓ | |||
remove existing properties | ✓ | ✓ | ||
change existing property values | ✓ | ✓ | ✓ |