[Harmony Proxies] Non-extensible, sealed and frozen Proxies

David Bruant david.bruant at labri.fr
Wed Sep 7 06:40:02 PDT 2011


Le 06/09/2011 18:15, Mark S. Miller a écrit :
> On Tue, Sep 6, 2011 at 8:08 AM, Tom Van Cutsem <tomvc.be at gmail.com 
> <mailto:tomvc.be at gmail.com>> wrote:
> [...]
>
>
>         Regardless, it's a good thing to provide the choice. Regarding
>         the open
>         issue ("do we default to Object.create or do we want to allow
>         for the
>         possibility of Array.create etc.?"), I think that the choice
>         should be
>         given to create any sort of object (why not host objects such as
>         NodeList?). One question would be: how could this (easily) be
>         achieved?
>
>
>     I've been thinking about a couple of ways, but there remain open
>     issues:
>
>     1) Have fix() not just return a property descriptor map, but a
>     tuple of [constructor, property descriptor map]. To create the
>     instance it needs to become, the proxy invokes the returned
>     constructor's "create" method with as first argument the proxy's
>     prototype and as second argument the prop. desc. map.
>
>     For example:
>
>     fix: function(operation) {
>       // I want to become an array
>       return [Array, { ... } ];
>     }
>
>
> Array.isArray and other [[Class]] checks (e.g., the Flanagan device of 
> using ({}).toString.call) need to give stable answers. Especially 
> because they currently always do give stable answers.
Indeed, so if a [[Class]] is given to a proxy, it has to be done at 
proxy creation so that the proxy and its fixed version are stable 
regarding [[Class]] checks.

>
>     2) Add the constructor to use upon fixing as an additional
>     argument to Proxy.create{Function}, e.g.:
>
>     var p = Proxy.create(handler, proto, Array);
>     // fix() trap will use Array.create
>
>
>     The thing is: we can't let proxy authors just pass any arbitrary
>     object as the "constructor", e.g.
>
>     var myconstructor = { create: function(proto, props) { ... } };
>     Proxy.create(handler, proto, myconstructor);
>
>     This is because myconstructor could return arbitrary live objects
>     from its call to "create", and the "become" trick with proxies
>     really only works when the proxy can transplant its brains with a
>     newborn object.
>
>     We could state that the "constructor" argument must be equal to
>     Object, Array, and perhaps a handful of other primitive
>     constructors, but that would probably rule out NodeList. How can
>     we get some guarantee that a function is effectively going to
>     produce and return a newborn object?
>
>
> How about we adapt ideas from the "<|" proposal?
This proposal is only about initializing the prototype. I don't see what 
can be adapted to work on [[Class]].


> Proxy.create already takes a proto argument. The third argument could 
> say whether the [[Class]] of the proxy should be "Object" or should be 
> the same as that proto. No constructors.
The notion of "same as the proto" is ambiguous. Do you mean that 
Proxy.create should guess which [[Class]] should be provided based on 
the prototype object?
If I use an object which inherits from Array.prototype, can I still be 
considered as an Array? If there is a [[Class]] A with usually a 
prototype Pa and a [[Class]] B with Pb which inherits from Pa. Can I 
still create an A object with Pb as prototype?

Passing a string and doing consistency checks sounds like a more 
flexible idea.

David
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20110907/46c908fc/attachment.html>


More information about the es-discuss mailing list