Skip to content

Instantly share code, notes, and snippets.

@rwaldron
Created May 10, 2012 16:21
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save rwaldron/2654256 to your computer and use it in GitHub Desktop.
Save rwaldron/2654256 to your computer and use it in GitHub Desktop.
Fat Arrows and Classes-as-Prototype-sugar make a beautiful future for JavaScript
var stream = require("fake-stream-lib"),
Emitter = require("events").EventEmitter,
util = require("util");
// Today...
function Device( opts ) {
this.value = null;
// open an async stream,
// this will be called continuously
stream.read( opts.path, function( data ) {
// Update this instance's current value
// with the most recent value from the
// data stream
this.value = data;
// bind(this) is required for correct scope
}.bind(this) );
// Throttle the frequency of events emitted from
// this Device instance
setInterval(function() {
// Emit a throttled event
this.emit("event");
// bind(this) is required for correct scope
}.bind(this), opts.freq || 100 );
}
util.inherits( Device, Emitter );
Device.prototype.scale = function( low, high ) {
return this.value * ( high - low ) / 1023 + low;
};
// ------------------------------------------------------ //
// w/ Fat Arrow...
function Device( opts ) {
this.value = null;
// open an async stream,
// this will be called continuously
stream.read( opts.path, ( data ) => {
// Update this instance's current value
// with the most recent value from the
// data stream
this.value = data;
// bind(this) is no longer required
});
// Throttle the frequency of events emitted from
// this Device instance
setInterval(() => {
// Emit a throttled event
this.emit("event");
// bind(this) is no longer required
}, opts.freq || 100 );
}
util.inherits( Device, Emitter );
Device.prototype.scale = function( low, high ) {
return this.value * ( high - low ) / 1023 + low;
};
// ------------------------------------------------------ //
// w/ Fat Arrow & Class...
class Device extends Emitter {
constructor( opts ) {
super();
this.value = null;
// open an async stream,
// this will be called continuously
// This example uses the expression
// form of a fat arrow
stream.read( opts.path, data => this.value = data );
// Throttle the frequency of events emitted from
// this Device instance
setInterval(() => {
// Emit a throttled event
this.emit("event");
}, opts.freq || 100 );
}
scale( low, high ) {
return this.value * ( high - low ) / 1023 + low;
}
}
@juandopazo
Copy link

I can live with function for methods. It's the nesting of functions inside methods that becomes noisy. Thin arrows make sense for consistency.

@chrisdickinson
Copy link

@juandopazo I can see some potential for confusion. I'd like to be able to use the arrow syntax when adding prototype methods, but there's a pretty big gotcha when doing that as it stands. It's a case for either making => soft binding (losing this when called against an object (or with apply, call, or bind)), or ->.

@chrisdickinson
Copy link

Or going the python route and exposing the original function somehow (boundmethod.im_func is how they do it); though I'd rather fix the problem in a more javascript-y way.

@angus-c
Copy link

angus-c commented May 10, 2012 via email

@dherman
Copy link

dherman commented May 10, 2012

I'm afraid soft bind will just never happen. I've argued against it for programming reasons, but it doesn't even really matter; the fact is it can't be implemented without making every call in the entire language more expensive. That would make the whole web slower, and JS engine implementers won't do it.

Dave

@domenic
Copy link

domenic commented May 10, 2012

<3

Re: thin arrows for methods. An alternative that has come up is using method shorthand in combination with the .{ operator:

Device.prototype.{
  scale( low, high ) {
    return this.value * ( high - low ) / 1023 + low;
  }
};

This has the added benefit (in the current TC39-approved status quo) that methods created using method shorthand get access to super. But, I believe as of last count .{ is not TC39-approved.

@polotek
Copy link

polotek commented May 11, 2012

I'm warming up to classes. The rest I'm still not crazy about.

@MarcDiethelm
Copy link

Omg, no fat arrows please!! On non-English keyboards the equals sign is often a character requiring shift to type. Thin arrow is better in that respect.

@angus-c
Copy link

angus-c commented May 13, 2012 via email

@juandopazo
Copy link

And English keyboard require shift for " which I'm sure it's written more often than function or =.

Non-English keyboard usually suck for coding anyway. Spanish-Spain keyboard requires Alt-Gr for both types of brackets. Alt-Gr! Fortunately there's the Latinamerican keyboard that looks a little more like the English one.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment