/*

To run, save as demo.js in an empty folder and then run:

  yarn add babel-cli babel-plugin-transform-class-properties
  ./node_modules/.bin/babel-node --plugins transform-class-properties demo.js

*/


class Foo {

  constructor () {
    this.name = 'OK'
    this.getName5 = this.getName1.bind(this)
  }

  getName1 () { return this.name }

  getName2 = () => { return this.name }

  getName3 = function () { return this.name }

  getName4 = function () { return this.name }.bind(this)

}


class Bar {

  constructor (foo) {
    this.name = 'BAAAAAAAAAAAD'
    this.getName1 = foo.getName1
    this.getName2 = foo.getName2
    this.getName3 = foo.getName3
    this.getName4 = foo.getName4
    this.getName5 = foo.getName5
  }

}


function getName6 () { return this.name }

const getName7 = () => { return this.name }


const foo = new Foo()
const bar = new Bar(foo)

bar.getName6 = getName6
bar.getName7 = getName7
bar.getName8 = getName6.bind(foo)
bar.getName9 = getName7.bind(foo)

console.log('getName1:', bar.getName1())
console.log('getName2:', bar.getName2())
console.log('getName3:', bar.getName3())
console.log('getName4:', bar.getName4())
console.log('getName5:', bar.getName5())
console.log('getName6:', bar.getName6())
console.log('getName7:', bar.getName7())
console.log('getName8:', bar.getName8())
console.log('getName9:', bar.getName9())