protection
Object.isExtensible
Returns true if new properties can be added to the object. Sealed, frozen, and preventExtensions'd objects all return false; primitives always return false.
Object.isExtensible(obj) Parameters
| Parameter | Purpose |
|---|---|
| obj | The value to test |
| returns | Boolean — true if extensible |
Examples
console.log(Object.isExtensible({})); Logs true — normal objects are extensible
const o = {};
Object.preventExtensions(o);
console.log(Object.isExtensible(o)); Logs false
console.log(Object.isExtensible(Object.freeze({}))); Logs false — freeze implies non-extensible
console.log(Object.isExtensible(42)); Logs false — ES2015+ returns false for primitives (previously threw)
Gotcha
Since ES2015 this returns false for primitive values rather than throwing. Being extensible says nothing about whether existing properties are writable — check isFrozen/isSealed for that.
Related methods
Object.preventExtensions
Prevents new properties from being added to an object, but existing properties can still be modified, deleted, or reconfigured. The weakest of the three protection levels.
Object.isSealed
Returns true if the object is sealed — non-extensible and all own properties are non-configurable. Frozen objects are always sealed; primitives are considered sealed.
Object.isFrozen
Returns true if the object is frozen — non-extensible, and every own property is non-configurable and (if a data property) non-writable. Primitives are considered frozen.
Object.freeze
Freezes an object: new properties cannot be added, existing properties cannot be removed, and their values, writability, and configurability cannot be changed. Returns the same object.
Object.seal
Seals an object: prevents new properties from being added and marks all existing properties as non-configurable. Existing writable properties can still be reassigned.