I have one class in JS (class1
) which receives the class2
in the constructor.
Now, what I want to achieve is that I want to be able to call all the functions of class2
on the class1
, but I don’t want to write all the function declarations in class1
and then each one of them calling on class2
.
Is there any clean way of doing this ?
Advertisement
Answer
One option is to use a Proxy:
class Worker { constructor(name) { this.name = name } method1() { console.log(this.name, 'method1') } method2() { console.log(this.name, 'method2') } } class Facade { constructor(worker) { this.worker = worker return new Proxy({}, this) } get(target, prop) { return prop in this.worker ? this.worker[prop] : this[prop] } ownMethod() { console.log('facade own method') } } let f = new Facade(new Worker('worker1')) f.method1() f.method2() f.ownMethod()
Another one is to copy method references to the facade object:
class Worker { constructor(name) { this.name = name } method1() { console.log(this.name, 'method1') } method2() { console.log(this.name, 'method2') } } class Facade { constructor(worker) { this.worker = worker for (let func of Object.getOwnPropertyNames(worker.constructor.prototype)) this[func] = worker.constructor.prototype[func].bind(worker) } ownMethod() { console.log('facade own method') } } let f = new Facade(new Worker('me')) f.method1() f.method2() f.ownMethod()
In Typescript you can use f = ... as (Facade & Worker)
Playground Link, but there might be better solutions.