InterviewHubPRO
Section Overview
Q505

Question 505 of 521

Part 8: Modern JavaScript APIs, WeakRef, Proxy & Performance (464 - 521)

97%
JavaScript Internals (521 Qs)•Part 8: Modern JavaScript APIs, WeakRef, Proxy & Performance (464 - 521)

What is the purpose of Object.getOwnPropertyDescriptors()?

Object.getOwnPropertyDescriptors() returns all own property descriptors of an object, including their attributes (value, writable, enumerable, configurable, get, set).

javascript
 const obj = {
   name: 'John',
   get fullName() {
     return this.name;
   }
 };

 const descriptors = Object.getOwnPropertyDescriptors(obj);
 console.log(descriptors);
 /*
 {
   name: {
     value: 'John',
     writable: true,
     enumerable: true,
     configurable: true
   },
   fullName: {
     get: [Function: get fullName],
     set: undefined,
     enumerable: true,
     configurable: true
   }
 }
 */

Use case 1: Shallow cloning with all property attributes:

javascript
 // Regular spread operator loses getters/setters
 const clone1 = { ...obj };

 // Using Object.assign also loses getters/setters
 const clone2 = Object.assign({}, obj);

 // Proper cloning with descriptors
 const properClone = Object.create(
   Object.getPrototypeOf(obj),
   Object.getOwnPropertyDescriptors(obj)
 );

Use case 2: Mixin pattern preserving all attributes:

javascript
 function mixin(target, ...sources) {
   for (const source of sources) {
     Object.defineProperties(
       target,
       Object.getOwnPropertyDescriptors(source)
     );
   }
   return target;
 }

 const obj1 = {
   get prop() { return 'getter'; }
 };

 const obj2 = {};
 mixin(obj2, obj1);
 console.log(obj2.prop); // 'getter'

Use case 3: Inspecting property configuration:

javascript
 const obj = {};
 Object.defineProperty(obj, 'readOnly', {
   value: 42,
   writable: false
 });

 const descriptor = Object.getOwnPropertyDescriptors(obj).readOnly;
 console.log(descriptor.writable); // false

Comparison with Object.getOwnPropertyDescriptor():

javascript
 // Single property
 const singleDesc = Object.getOwnPropertyDescriptor(obj, 'name');

 // All properties
 const allDescs = Object.getOwnPropertyDescriptors(obj);