I don't get the difference between the proto operator and some setPrototype method that could be added (or the actual __proto__ property)...
On Sat, Sep 24, 2011 at 6:03 PM, David Bruant <[email protected]> wrote: > Le 24/09/2011 15:33, Jake Verbaten a écrit : >> There is no standardized way to create a new function with a prototype >> which is not Function.prototype. >> >> I propose Function.create >> >> /* >> Creates a new function whose prototype is proto. >> The function body is the same as the function fbody. >> The hash of propertydescriptors props is passed to >> defineproperties just like >> Object.create does. >> */ >> Function.create = (function() { >> var functionBody = function _getFunctionBody(f) { >> return f.toString().replace(/.+\{/, "").replace(/\}$/, ""); >> }; >> var letters = "abcdefghijklmnopqrstuvwxyz".split(""); >> >> return function _create(proto, fbody, props) { >> var parameters = letters.slice(0, fbody.length); >> parameters.push(functionBody(fbody)); >> var f = Function.apply(this, parameters); >> f.__proto__ = proto; >> Object.defineProperties(f, props); >> return f; >> }; >> })(); >> >> This is the same as Object.create except the second parameter is a >> function. >> >> It will create a new function whose function body is the same as the >> function passed in. >> >> I don't believe this is possible to do in ES5 without __proto__ > It is not indeed. > This topic has been discussed a couple of times here. There is one > proposal that is more generic than your solution which is the proto > operator [1]. > > Basically, to create a function with a chosen prototype, you can do: > ----- > var f = myProto <| function(a, b){return a+b;} > Object.getPrototypeOf(f); // myProto > f(1, 2); // 3 > ----- > > I'm a big fan of the proto operator proposal, however, as raised > previously this operator relies on the object being created to have an > intialisation syntax. This prevents, for instance, Date objects to have > a custom prototype with this method. I am not very familiar with it yet, > but I think that if they ever came to life, ParallelArrays [2] would > suffer from the same problem. > By the way, could someone add this concern as a note ("open issue" or > "limitation" or something like this) in the proto operator page, please? > > One even more generic way which would work even for objects that have no > initialization syntax would to standardize one of [3] or [4]. Is there a > wiki page mentionning these two functions somewhere? If not, may it be > added and linked in some way to the proto operator? > > David > > [1] http://wiki.ecmascript.org/doku.php?id=harmony:proto_operator > [2] > https://github.com/RiverTrail/RiverTrail/blob/15ae7f6f77d9d2842d9d75458017efd9fe0fbee7/jslib/ParallelArray.js#L29 > [3] https://mail.mozilla.org/pipermail/es-discuss/2011-March/013141.html > [4] https://mail.mozilla.org/pipermail/es-discuss/2011-March/013154.html > _______________________________________________ > es-discuss mailing list > [email protected] > https://mail.mozilla.org/listinfo/es-discuss > _______________________________________________ es-discuss mailing list [email protected] https://mail.mozilla.org/listinfo/es-discuss

