Decorator to automatically bind methods to class instances
JavaScript Makefile
Clone or download
stevemao Merge pull request #66 from tbrunel/patch-1
Update README.md / fix typo
Latest commit 2cbf1e0 Jul 9, 2018

README.md

autobind decorator

A class or method decorator which binds methods to the instance so this is always correct, even when the method is detached.

This is particularly useful for situations like React components, where you often pass methods as event handlers and would otherwise need to .bind(this).

// Before:
<button onClick={ this.handleClick.bind(this) }></button>

// After:
<button onClick={ this.handleClick }></button>

As decorators are a part of future ECMAScript standard they can only be used with transpilers such as Babel.

Note Babel 6 users:

The implementation of the decorator transform is currently on hold as the syntax is not final. If you would like to use this project with Babel 6.0, you may use babel-plugin-transform-decorators-legacy which implement Babel 5 decorator transform for Babel 6.

Note TypeScript users:

This package will work out of the box with TypeScript (no Babel needed) and includes the .d.ts typings along with it.

Installation:

npm install autobind-decorator

Examples:

import autobind from 'autobind-decorator'

class Component {
  constructor(value) {
    this.value = value
  }

  @autobind
  method() {
    return this.value
  }
}

let component = new Component(42)
let method = component.method // .bind(component) isn't needed!
method() // returns 42


// Also usable on the class to bind all methods
// Please see performance if you decide to autobind your class
@autobind
class Component { }

Performance

autobind on a method is lazy and is only bound once. 👍

However,

It is unnecessary to do that to every function. This is just as bad as autobinding (on a class). You only need to bind functions that you pass around. e.g. onClick={this.doSomething}. Or fetch.then(this.handleDone) -- Dan Abramov‏

You should avoid using autobind on a class. 👎

I was the guy who came up with autobinding in older Reacts and I'm glad to see it gone. It might save you a few keystrokes but it allocates functions that'll never be called in 90% of cases and has noticeable performance degradation. Getting rid of autobinding is a good thing -- Peter Hunt

Alternative

You might want to look at Class instance properties.