[Fwd: Fail-fast on non-existing [[Get]]]

Herby Vojčík herby at mailbox.sk
Wed Oct 17 05:26:33 PDT 2012



Yehuda Katz wrote:
>
> Yehuda Katz
> (ph) 718.877.1325
>
>
> On Tue, Oct 16, 2012 at 12:51 PM, Herby Vojčík <herby at mailbox.sk
> <mailto:herby at mailbox.sk>> wrote:
>
>     This did not get to the list, reposting...
>
>     -------- Original Message --------
>     From: Herby Vojčík <herby at mailbox.sk <mailto:herby at mailbox.sk>>
>     Subject: Fail-fast on non-existing [[Get]]
>     Date: Fri, 12 Oct 2012 22:42:05 +0200
>     To: ECMAScript discussion <es-discuss at mozilla.org
>     <mailto:es-discuss at mozilla.org>>
>
>     Hello!
>
>     I have just looked the video on channel9 between Lars Bak and Anders
>     Hejlsberg, and it gave me one idea.
>
>     It seems people sometimes worry about (basically because of a typo) that
>     they [[Get]] a non-existing property but as it stands, it just returns
>     undefined and goes happily on.
>
>     I see two solutions:
>        - add something to the freeze, seal, preventExtensions family which
>     would set an object to the fail-fast [[Get]] state.
>        - use a Proxy in the proto chain to trap the unknown [[Get]] and
>     throw early
>
>
> Using a proxy for your own objects to throw seems reasonable, but see
> below for breakage to existing JS patterns. Adding it globally (via
> Object.protoype.__proto__) would almost certainly break other JS code on
> the page.
>
> Consider this very common pattern:
>
>    obj.foo = obj.foo || bar;

I was too dense, again. By no means in Object.prototype.__proto__. I 
meant "in the prototype chain for the class of object I want to throw on 
unknown [[Get]]. IOW, under Object.prototype.__proto__.

(I put it in the P.S. down there...)

> As a matter of practice, lots of JS code relies on the soft-fail
> behavior, for good reason, and trying to change that behavior would not
> likely result in happiness for consumers of the code that introduced
> this change.

Sure.

>     Do you think this needs a solution at all? If yes, which option would
>     you favour?
>
>     Herby
>
>     P.S.: In the latter case, I see the possibility of putting
>     ClosedFormObject (or whatever name) constructor function which would
>     have a proxy for a .prototype just one step below Object, and let
>     classes that would want to throw on default-undefined-[[Get]] just
>     derive from that or its ancestors. Do you think this is minimal enough
>     so it can be put directly into language (if the solution does not have
>     some flaws which are not apparent to me)?


More information about the es-discuss mailing list