<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">Le 26 sept. 2018 à 16:27, Mike Samuel <<a href="mailto:mikesamuel@gmail.com" class="">mikesamuel@gmail.com</a>> a écrit :</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><div dir="ltr" class=""><div dir="ltr" class="">Might it be a spec bug that in the below, o's prototype changes, and o.x !== b.x?</div><div dir="ltr" class=""><div class=""><br class=""></div><div class=""><div class=""><font face="monospace, monospace" class="">const a = makeIntercepter();</font></div><div class=""><font face="monospace, monospace" class="">const b = { x: 1 };</font></div><div class=""><font face="monospace, monospace" class="">const o = Object.assign(</font></div><div class=""><font face="monospace, monospace" class="">  {},</font></div><div class=""><font face="monospace, monospace" class="">  a,</font></div><div class=""><font face="monospace, monospace" class="">  b);</font></div><div class=""><font face="monospace, monospace" class=""><br class=""></font></div><div class=""><font face="monospace, monospace" class="">console.log(`o is plain Object: ${ Object.getPrototypeOf(o) === Object.prototype }`);</font></div><div class=""><font face="monospace, monospace" class=""><br class=""></font></div><div class=""><font face="monospace, monospace" class="">console.log(`b.x=${ b.x }, o.x=${ o.x }`);</font></div><div class=""><font face="monospace, monospace" class=""><br class=""></font></div><div class=""><font face="monospace, monospace" class="">function makeIntercepter() {</font></div><div class=""><font face="monospace, monospace" class="">  return JSON.parse(</font></div><div class=""><font face="monospace, monospace" class="">    // Get an object that has an actual "__proto__" property.</font></div><div class=""><font face="monospace, monospace" class="">    '{ "__proto__": {} }',</font></div><div class=""><font face="monospace, monospace" class="">    // Replace the __proto__ property's value with one that</font></div><div class=""><font face="monospace, monospace" class="">    // traps assignment to x.</font></div><div class=""><font face="monospace, monospace" class="">    (key, value) => (</font></div><div class=""><font face="monospace, monospace" class="">      (key === '__proto__')</font></div><div class=""><font face="monospace, monospace" class="">        ? {</font></div><div class=""><font face="monospace, monospace" class="">            set x(v) {</font></div><div class=""><font face="monospace, monospace" class="">              console.log(`intercepted ${ v }`);</font></div><div class=""><font face="monospace, monospace" class="">            },</font></div><div class=""><font face="monospace, monospace" class="">            get x() {</font></div><div class=""><font face="monospace, monospace" class="">              return 2;</font></div><div class=""><font face="monospace, monospace" class="">            },</font></div><div class=""><font face="monospace, monospace" class="">          }</font></div><div class=""><font face="monospace, monospace" class="">        : value));</font></div><div class=""><font face="monospace, monospace" class="">}</font></div></div><div class=""><br class=""></div><div class="">In modern Chrome, Firefox, Safari I get</div><div class=""><div class=""><font face="monospace, monospace" class="">intercepted 1</font></div><div class=""><font face="monospace, monospace" class="">getPrototypeOf(o)===Object.prototype: false</font></div><div class=""><font face="monospace, monospace" class="">b.x=1, o.x=2</font></div></div><div class=""><br class=""></div></div></div></div>
_______________________________________________<br class="">es-discuss mailing list<br class=""><a href="mailto:es-discuss@mozilla.org" class="">es-discuss@mozilla.org</a><br class=""><a href="https://mail.mozilla.org/listinfo/es-discuss" class="">https://mail.mozilla.org/listinfo/es-discuss</a><br class=""></div></blockquote><br class=""></div><div><span style="font-size: 36px;" class="">🤦</span> It’s not a bug. But you definitely convinced me to add `delete Object.prototype.__proto__` at the top of my JS.</div><div><br class=""></div><div>—Claude</div><br class=""></body></html>