Le 16/03/2011 09:11, Tom Van Cutsem a écrit :
> Hi,
>
> I have no objections to the use cases you're proposing, but in the
> interest of keeping the Proxy.createFunction method somewhat simple,
> why isn't the following sufficient:
>
> // [[Construct]]-less functions:
> var f = Proxy.createFunction(handler, callTrap, function() { throw
> "can't construct"; });
>
> // [[Call]]-less functions:
> var f = Proxy.createFunction(handler, function() { throw "can't call";
> }, constructTrap);
It is sufficient, you are completely right :-)
And as noted by Brendan, it is actually indeed better that the user can
customize the thrown message.> Distinguishing between |null| and |undefined| to trigger one default > behavior or the other feels a bit subtle to me. Are there precedents > for this? > > As for the clarifying note on constructors: agreed. It doesn't hurt to > be explicit about this. > > Cheers, > Tom > > 2011/3/15 David Bruant <[email protected] > <mailto:[email protected]>> > > Le 15/03/2011 00:52, David Bruant a écrit : >> Hi, >> >> I've been thinking about Function proxy use cases lately. Things >> that the spec do and that could be convenient to emulate as well >> or just things that could be useful. >> * [[Construct]]-less functions. >> All Array.prototype methods are like that as well as all global >> object methods (parseInt...) as well as a most of built-in >> methods. In some way, if you want to define function which >> wouldn't make sense as constructors (Math functions are a >> caricature of that), [[Construct]]-less functions would be a good >> way to raise error if someone, by accident, write "new blabla()" >> or even "new blabla". >> It has been suggested here: >> https://mail.mozilla.org/pipermail/es-discuss/2011-March/013019.html >> I think that it was a bit too hacky. I would suggest more of a >> syntax like: >> var pf = Proxy.createFunction({}, myCall, null); >> >> * [[Call]]-less constructors >> Already possible throughpf = Proxy.createFunction({}, null, >> myConstructor); > Spoke too quickly. This throws a TypeError both in proposal and > FF4 implementation. > I would argue that this can be useful if I want to define "just a > constructor". In most cases, people use function as functions or > constructor, I have rarely seen both (except for Array or other > built-in constructors which are, as said, built-in). [[Call]]-less > functions would be a way to prevent what is intended to be a > constructor to be called as a function. > > >> >> * "new A" behaves exactly like "A". This can be found for Arrays >> for instance. >> Already possible through pf = Proxy.createFunction({}, myCall, >> undefined); >> >> >> Finally, I'd like to add a note on constructors. On the proposal >> is written: "If no constructTrap is provided, new proxy(...args) >> is reified as calling the proxy’s callTrap with |this| bound to a >> new object delegating to proxy.prototype". >> In order to clarify, I think that instead of "proxy.prototype" it >> would be better to say "the result of calling the get trap on the >> proxy with argument 'prototype'". The get trap is the equivalent >> tothe [[Get]] internal method used in ES5.1 13.2.2step 5. >> Or maybe saying that the [[Construct]]algorithm (13.2.2) will be >> used. >> >> David > > > _______________________________________________ > es-discuss mailing list > [email protected] <mailto:[email protected]> > https://mail.mozilla.org/listinfo/es-discuss > >
_______________________________________________ es-discuss mailing list [email protected] https://mail.mozilla.org/listinfo/es-discuss

