<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Sep 15, 2014 at 8:37 PM, Alex Kocharin <span dir="ltr"><<a href="mailto:alex@kocharin.ru" target="_blank">alex@kocharin.ru</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div> </div><div> </div><div>15.09.2014, 23:23, "Rick Waldron" <<a href="mailto:waldron.rick@gmail.com" target="_blank">waldron.rick@gmail.com</a>>:</div><div><div class="h5"><blockquote type="cite"><div><br><div><br><div>On Mon, Sep 15, 2014 at 2:57 PM, Brendan Eich <span><<a href="mailto:brendan@mozilla.org" target="_blank">brendan@mozilla.org</a>></span> wrote:<br><blockquote style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span><span>Rick Waldron wrote:<br></span></span><blockquote style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">The first is also objectionable because it breaks existing implicit return semantics.</blockquote>Say what? Constructors can return a different object from `this`, that's just JS.</blockquote><div> </div><div>Yikes, I should've been more specific. Generally, it's considered an anti-pattern to write constructors that explicitly return an object to override `this`(for all the reasons you'd expect)—that's not to say that it isn't done or doesn't exist (and certainly I didn't mean to imply that it wasn't possible). Design that might rely on that pattern would conflict with widely accepted best practices. </div><div> </div></div></div></div></blockquote><div> </div></div></div><div>Writing constructors that override `this` is not an anti-pattern. It's an implementation detail that should not ever matter to any outside code.</div><div> </div><div>If your code breaks because somebody returns another object from constructor, you're doing it wrong.</div></blockquote><div><br></div><div>Overriding `this` with an explicit return object will break the link to the constructor's prototype object properties:</div><div><br></div><div><div>  function C() {</div><div>    return {};</div><div>  }</div><div><br></div><div>  C.prototype.m = function() {</div><div>    return "Previously on Lost";</div><div>  };</div><div><br></div><div>  var c = new C();</div><div><br></div><div>  console.log(c.m()); // nope.<br></div></div><div><br></div><div><br></div><div>Rick</div><div><br></div></div></div></div>