Codectionary / Developer documentation / JavaScript

Object.defineProperty() & Property Descriptors

Object.defineProperty() gives fine-grained control over a single property's behavior via a descriptor object, letting you control whether it is writable, enumerable (shows up in loops/Object.keys), and configurable (can be redefined or deleted) - none of which is possible with normal property assignment.

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 hidden

Reading 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 true

Best 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

At a glance

Purpose
Application logic and interaction
File extension
.js ยท .mjs
Runs in
Browsers and JavaScript runtimes
Usually used with
HTML, CSS and Web APIs

Specifications & further reading

Related JavaScript documentation