Object.assign interaction with __proto__ field.

Mike Samuel mikesamuel at gmail.com
Wed Sep 26 14:27:42 UTC 2018


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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20180926/7f2f307a/attachment.html>


More information about the es-discuss mailing list