Class Decorators

by Vladimir Kutepov

JavaScript

class A {
	constructor() {
    this.print('init')
  }
  print(str) {
  	console.log(str, this)
  }
}

class B {
	constructor(a) {
    this.decorate(a, 'print', this.printDecorator)
  }
  decorate(obj, prop, fn) {
    Object.defineProperty(obj, prop, { value: fn.call(this, obj[prop]) })
	}
  printDecorator(fn) {
    console.log('print -> decorated', this)
    return function (...args) {
      const start = performance.now()
      const result = fn.apply(this, args)
      const end = performance.now()
      console.log(`print -> ${end - start} ms`)
      return result
    }
  }
};

const a = new A()
a.print('hello')
a.print('world')

// after some time
const b = new B(a)
a.print('hello')
a.print('world')