<div dir="ltr"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>const goodPromises = new WeakSet();<br></div>class DefensivePromise {<br>  constructor(x) {<br>    super(x);<br>    if (new.target === DefensivePromise) {<br>      Object.freeze(this);<br>      goodPromises.add(this);<div>    }<br>  }<br>  static resolve(x) {<br>    if (goodPromises.has(x)) {<br>      return x;  // should be equiv to super.resolve(x);<br>    }<br>    return new DefensivePromise(r => {r(x)});<br>  }<br>}<br><br></div></div></blockquote><div><br></div><div>Basically you can't rely on new.target to mean what you think it means, in the face of Reflect.construct.</div><div><br></div><div>Maybe this?</div><div><br></div><div>constructor(x) {</div><div>    super(x);</div><div>    // At this point you know that "this" is a Promise, but you don't</div><div>    // know if the prototype is set correctly, so:</div><div>    if (Object.getPrototypeOf(this) === DefensivePromise.prototype)</div><div>        gooPromises.add(Object.freeze(this));</div><div>}</div></div></div>