如何创建“代理”对象的类?

时间:2018-09-18 09:37:37

标签: typescript

我想创建一个行为与另一个类完全相同的类。但是对象必须已经实例化,所以我不能使用继承:

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类中的所有方法的情况下做到这一点?

1 个答案:

答案 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

Playground link