我想创建一个行为与另一个类完全相同的类。但是对象必须已经实例化,所以我不能使用继承:
class Welcomer {
sayHello () {
console.log('Hello World')
}
}
class Foo {
private welcomer;
constructor (welcomer: Welcomer) {
this.welcomer = welcomer;
}
sayHello () {
this.welcomer.sayHello();
}
}
基本上,我希望我的Foo
类具有Welcomer
类的所有方法。并且Foo
类上的方法应仅调用Welcomer
类上的方法。
如何在不重写Foo
类中的所有方法的情况下做到这一点?
答案 0 :(得分:2)
您可以在ES2015中使用Proxy
类来拦截get / set调用并包装函数并调用代理实现:
class Welcomer {
sayHello() {
console.log('Hello World')
}
}
var welcomer = new Welcomer();
var proxy = new Proxy(welcomer, {
get(target, prop) {
var value = target[prop as keyof Welcomer];
if(typeof value === 'function'){
return function() {
console.log(`Calling ${prop.toString()}`);
value.apply(target, arguments);
}
}
return value;
}
})
proxy.sayHello()
proxy.foo() // error