Rick Waldron (2014-04-22T22:20:33.000Z)
forbes at lindesay.co.uk (2014-04-23T19:49:19.506Z)
On Tue, Apr 22, 2014 at 1:27 PM, Claude Pache <claude.pache at gmail.com>wrote: > Hi, > > There has been request to add `Object.getOwnPropertyDescriptors` (plural) > to the standard. Reviewing use cases presented in thread [1] or in older > thread [2], it seems to me that all of them boil down to copy all own > properties of one object to another, e.g., > > Object.defineProperties(target, > Object.getOwnPropertyDescriptors(source)) > Object.create(proto, Object.getOwnPropertyDescriptors(source)) > // etc. > > However, this is exactly what `Object.mixin` (deferred from ES6) was > designed for: > > Object.mixin(target, source) > Object.mixin(Object.create(proto), source) > // etc. > > Besides being shorter to write, `Object.mixin` has the advantages of (1) > not creating an intermediate object; (2) taking care of some subtleties, > like rebinding `super` for methods, getters and setters if needed. > > Therefore, I think that `Object.mixin` is a better function to have than > `Object.getOwnPropertyDescriptors`. > The latter is not replacing the former; they are different APIs for different use cases. For example, Object.mixin cannot be used to derive descriptors from an object and filter then properties by descriptor attribute value: ```js // module.js function descriptorsByAttributeFilter(o, filter = {}) { var descriptors = Object.getOwnPropertyDescriptors(o); var filters = Object.keys(filter); return Object.keys(descriptors).reduce((accum, key) => { var descriptor = descriptors[key]; if (filters.every(field => descriptor[field] === filter[field])) { accum[key] = descriptor; } return accum; }, {}); } export function writables(o) { return descriptorsByAttributeFilter(o, { writable: true }); } export function nonwritables(o) { return descriptorsByAttributeFilter(o, { writable: false }); } // script.js import {writables, nonwritables} from "module"; var o = Object.defineProperties({}, { thisisnonwritable: { value: 1, writable: false }, thisiswritable: { value: 2, writable: true } }); console.log( writables(o) ); console.log( nonwritables(o) ); ```