Improving Function.prototype.bind

Brendan Eich brendan at mozilla.com
Sun Jan 8 21:35:40 PST 2012


Thanks, good to survey again -- we did when considering bind for ES5 (then 3.1 IIRC). Andrew Dupont's JSConf.us 2011 talk covered the particular Prototype history too.

http://blip.tv/jsconf/jsconf2011-andrew-dupont-everything-is-permitted-extending-built-ins-5211542

/be


On Jan 8, 2012, at 9:22 PM, John-David Dalton wrote:

> Just a bit of back story on Function#bind because I think it's good to know.
> Prototype's Function#bind was based on the 2004 post "Object-Oriented
> Event Listening through Partial Application in JavaScript" by Daniel
> Brockman:
> http://web.archive.org/web/20100901172230/http://brockman.se/2004/method-references/
> 
> There was no de-facto standard of Function#bind. ExtJS, PrototypeJS,
> MooTools, Dojo, and jQuery each had their own implementations.
> 
> MooTools Function#bind used to be implemented like:
>  function fn() {
>    console.log([].slice.call(arguments));
>  }
>  var f = fn.bind({}, ['a', 'b']); // notice an array of arguments
>  f('c'); // ['a', 'b'] // ignored arguments passed to the bound function
> 
> Ext's implementation is completely different:
> http://www.sencha.com/learn/legacy/Manual:Utilities:Function#createDelegate
> 
> Even though Dojo and jQuery implementations don't extend
> Function.prototype they follow Prototype's implementation with the
> exception that they also allow passing a string instead of a function
> and jQuery adds a `guid` property to the bound function.
> http://dojotoolkit.org/api/dojo.hitch
> http://api.jquery.com/jQuery.proxy/#example-1
> 
> Prototype 1.7's Function#bind (which overwrites native bind too) isn't
> as ES5 compliant as it could be because its bound function doesn't
> behave correctly when called as part of a new expression.
> 
>  function Foo(a,b,c) {
>    this.a = a;
>    this.b = b;
>    this.c = c;
>  }
>  var Bound = Foo.bind({}, 1, 2);
>  var b = new Bound(3);
>  console.log(Object.keys(b));  // [], but should be ['a', 'b', 'c']
>  console.log(b.c) // undefined, but should be 3
> 
> - JDD
> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20120108/9a2c74ec/attachment.html>


More information about the es-discuss mailing list