Object.assign interaction with __proto__ field.

Jordan Harband ljharb at gmail.com
Wed Sep 26 15:21:17 UTC 2018


You don't need JSON.parse there - see `Object.getPrototypeOf({
['__proto__']: null }) !== null`.

On Wed, Sep 26, 2018 at 10:27 AM, Mike Samuel <mikesamuel at gmail.com> wrote:

> Might it be a spec bug that in the below, o's prototype changes, and o.x
> !== b.x?
>
> const a = makeIntercepter();
> const b = { x: 1 };
> const o = Object.assign(
>   {},
>   a,
>   b);
>
> console.log(`o is plain Object: ${ Object.getPrototypeOf(o) ===
> Object.prototype }`);
>
> console.log(`b.x=${ b.x }, o.x=${ o.x }`);
>
> function makeIntercepter() {
>   return JSON.parse(
>     // Get an object that has an actual "__proto__" property.
>     '{ "__proto__": {} }',
>     // Replace the __proto__ property's value with one that
>     // traps assignment to x.
>     (key, value) => (
>       (key === '__proto__')
>         ? {
>             set x(v) {
>               console.log(`intercepted ${ v }`);
>             },
>             get x() {
>               return 2;
>             },
>           }
>         : value));
> }
>
> In modern Chrome, Firefox, Safari I get
> intercepted 1
> getPrototypeOf(o)===Object.prototype: false
> b.x=1, o.x=2
>
>
> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20180926/8718f1a8/attachment-0001.html>


More information about the es-discuss mailing list