Le 31/08/2011 13:24, Tom Van Cutsem a écrit :
2011/8/30 Brendan Eich <[email protected] <mailto:[email protected]>>

    On Aug 30, 2011, at 2:16 PM, David Bruant wrote:
    Actually that's what current function proxies do by default (no
    .prototype unless otherwise specified). My suggestion is to put a
    .prototype by default with keeping the option to opt-out (same
    with .length, etc.)
    Right, of course function proxies have to trap in order to emulate
    .prototype and other properties.


Indeed, that was our intent: fproxy.prototype and fproxy.length are determined by the handler via the "get" trap. This should work fine for fproxy.prototype (and it is actually consulted when evaluating |obj instanceof fproxy|.)

For fproxy.length, the handler object can only return the call trap's length if it has a reference to the call trap, which as David points out, in the general case it does not. OTOH, typically a function proxy will wrap some other target function f, in which case the handler would simply return f.length, so I don't know whether this issue is such a big deal.
True. Still, a handler needs an access to the callTrap in order to retrieve its length in the general case. And with the current API, it may be impossible for an already created handler (not one created through a factory) to access to the callTrap, making impossible to access its .length and .prototype I agree that the typical case is to wrap, but is it a sufficient reason for people not wrapping to not be able to properly emulate function.length?

If one wraps an existing function f using the default ForwardingHandler like so:
var fproxy = Proxy.createFunction(new ForwardingHandler(f), f);
Alternatively, i suggested earlier this summer [1] to put callTrap and constructTrap as part of the handler. This which would solve the problem of a handler having access to the callTrap ("this.call" from any other trap) and would also solve the question "what if handler.call.length !== handler.construct.length?" which would be left to the author discretion.

David

[1] https://mail.mozilla.org/pipermail/es-discuss/2011-August/016247.html
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to