PS Correction: it's actually a non-standard extension that regexps are callable 
in SpiderMonkey. So the invariant is that the only callable non-host objects 
are descendants of Function, or possibly host objects. This doesn't change my 
overall point, though.

On Feb 23, 2011, at 2:26 PM, David Herman wrote:

> I've been working on a prototype implementation of the binary data spec in 
> pure JS (implemented via typed arrays) and I've been bitten by the lack of a 
> standard mechanism for subclassing Function.
> 
> I'm using proxies for the implementation, and Proxy.createFunction doesn't 
> let me specify a custom prototype. Now, I can understand that this preserves 
> the existing property of the language that the only callable things are 
> either regexps or descendants of Function. But we could extend the proxy API 
> to allow custom functions with user-specified prototypes and still preserve 
> this property:
> 
>    Proxy.createFunction(handler, callTrap[, constructTrap[, proto]])
> 
> The proto argument would default to the original value of Function.prototype 
> [1]. But if the user provides a prototype, the library could enforce that 
> proto instanceof Function [2]. This way we would preserve the invariant that 
> for any callable value v, either v is a regexp or (typeof v === "function" && 
> v instanceof Function).
> 
> Maciej has also suggested a Function.create(...) API for more lightweight 
> creation of function subtypes. This would strengthen the argument for 
> allowing Proxy.createFunction to specify a prototype, since 
> Proxy.createFunction() ought to be able to do anything Function.create() can 
> do.
> 
> I'm curious to know if there are reasons I've missed why 
> Proxy.createFunction() doesn't support a custom prototype. It seems to me 
> like a nice additional expressiveness without any great loss of language 
> invariants. But I may have missed something.
> 
> Thanks,
> Dave
> 
> [1] In the face of multiple globals, this would be the Function associated 
> with the same global as Proxy. (BTW, I intend to work with Andreas on 
> speccing out multiple globals.)
> 
> [2] Again, the Function associated with the same global as Proxy.
> 
> _______________________________________________
> es-discuss mailing list
> es-discuss@mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss

_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to