Function.create
Xavier MONTILLET
xavierm02.net at gmail.com
Sat Sep 24 10:30:32 PDT 2011
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 <david.bruant at labri.fr> 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
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
>
More information about the es-discuss
mailing list