Syntax
Object.defineProperty(obj, "prop", { value, writable, enumerable, configurable });Examples
Creating a Read-Only Property
Making a property that cannot be reassigned.
const config = {};
Object.defineProperty(config, "version", {
value: "1.0.0",
writable: false,
enumerable: true,
configurable: false
});
config.version = "2.0.0"; // silently fails (or throws in strict mode)
console.log(config.version); // still "1.0.0"Hiding a Property from Enumeration
Creating a property that exists but does not show up in Object.keys() or for...in.
const user = { name: "Alice" };
Object.defineProperty(user, "id", {
value: 12345,
enumerable: false // hidden from normal enumeration
});
console.log(user.id); // 12345 - still directly accessible
console.log(Object.keys(user)); // ["name"] - "id" is hiddenReading Existing Descriptors
Inspecting a property's current descriptor.
const obj = { greeting: "hello" };
console.log(Object.getOwnPropertyDescriptor(obj, "greeting"));
// { value: "hello", writable: true, enumerable: true, configurable: true }
// Normal property assignment defaults to all three flags being trueBest practices
- Use Object.defineProperty() when you need precise control over a property's behavior - for everyday object properties, normal assignment is simpler and sufficient
- Set enumerable: false for internal/implementation-detail properties that should not appear in loops or JSON serialization
- Remember get/set can also be defined via descriptors, as an alternative to the get/set literal syntax
- Use this sparingly in application code - it is more commonly seen inside libraries, polyfills, and framework internals
Runtime & versions
Browsers and JavaScript runtimes. Feature availability depends on the language and runtime version used by your project; consult the official reference below.
ECMAScript specification