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')