The Object.defineProperty() method in JavaScript allows you to define or modify a property directly on an object and control the property’s behaviour. It provides fine-grained control over the properties of objects, including whether they are writable, enumerable, or configurable.
Syntax
obj: The object on which to define the property.
prop: The name of the property to be defined or modified.
descriptor: An object that describes the property being defined or modified.
Property Descriptors
A property descriptor is an object that can contain the following keys:
value: The value associated with the property (data descriptor).
writable: Boolean indicating if the property value can be changed.
configurable: Boolean indicating if the property can be deleted or changed.
enumerable: Boolean indicating if the property will be listed during enumeration of the properties (like in a for…in loop).
Examples
Basic Example
Let’s create an object and define a new property on it using Object.defineProperty().
// Define a property ‘name’ on the person object
Object.defineProperty(person, ‘name’, {
value: ‘Alice’,
writable: true,
enumerable: true,
configurable: true
});
console.log(person.name); // Output: Alice
Making a Property Read-Only
You can use Object.defineProperty() to make a property read-only by setting writable to false.
value: 30,
writable: false,
enumerable: true,
configurable: true
});
console.log(person.age); // Output: 30
person.age = 25; // This will not change the value of age
console.log(person.age); // Output: 30
Making a Property Non-Enumerable
You can make a property non-enumerable by setting enumerable to false.
value: ‘female’,
writable: true,
enumerable: false,
configurable: true
});
console.log(person.gender); // Output: female
for (let key in person) {
console.log(key); // Output: name, age (gender is not listed)
}
Summary
Object.defineProperty() gives you detailed control over the properties of an object. You can control whether a property is writable, enumerable, configurable, and even define custom getters and setters. This makes it a powerful tool for creating complex and well-encapsulated objects in JavaScript.