`Object.defineProperties(target, Object.getOwnPropertyDescriptors(source))`?

On Thu, Feb 13, 2020 at 2:24 AM Andrea Giammarchi <
andrea.giammar...@gmail.com> wrote:

> Both `Object.assign` and `{...extend}` suffer a tiny gotcha: properties
> are never assigned, neither retrieved, as accessors, with side-effects too.
>
> Example:
> ```js
> const Counter = {
>   _count: 0,
>   get count() {
>     return this._count++;
>   }
> };
>
> const incr1 = Object.assign({}, Counter);
> const incr2 = {...Counter};
>
> console.log(
>   incr1.count,    // 0
>   incr2.count,    // 1
>   Counter._count  // 2
> );
>
> // functionality also compromised
> console.log(incr1.count === incr1.count);
> ```
>
> Not only most of the time this is unexpected, but there's literally no way
> to pass along accessors with a similar `Object.assign` ease, even if that's
> what most developers would expect (at least up to the first time they
> encounter above issue).
>
> How about we introduce `Object.assignProperties` instead?
>
> A polyfill example:
>
> ```js
> const {assign, defineProperties, getOwnPropertyDescriptors} = Object;
> const assignProperties = (base, ...mixins) => defineProperties(
>   base,
>   mixins.reduce(
>     (descriptors, mixin) => assign(
>       descriptors,
>       getOwnPropertyDescriptors(mixin)
>     ),
>     {}
>   )
> );
> ```
>
> We can now use objects and mixins without side-effecting sources used to
> extend, and preserving accessors in the process.
>
> ```js
> const Counter = {
>   _count: 0,
>   get count() {
>     return this._count++;
>   }
> };
>
> const incr1 = Object.assignProperties({}, Counter);
> const incr2 = Object.assignProperties({}, Counter);
>
> console.log(
>   incr1.count,    // 0
>   incr2.count,    // 0
>   Counter._count  // 0
> );
>
> // always false: preserved functionality
> console.log(incr1.count === incr1.count);
> ```
>
> Thoughts ?
> _______________________________________________
> es-discuss mailing list
> es-discuss@mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
>
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to