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);