从Decorator中获取类实例

时间:2016-07-17 20:29:21

标签: javascript typescript ecmascript-6 decorator

我试图将我的思绪完全包裹在装饰者周围,我有一些巧妙的想法,我可以在我正在研究的回流实施中使用它们。我想用一个动作标记商店的类方法,并且无论何时生成该动作,它都知道调用任何用它标记的方法。

首先,我想标记Store方法:

@Action
public setData(data: FakeData) {
    console.log(this);
    this.state.data = data;
}

然后,在动作类中,我想在数组中注册该方法:

class Action {
    private static methods: Method<FakeData>[] = [];

    public static register(method: Method<FakeData>) {
        this.methods.push(method);
    }

    constructor(payload: FakeData);
    constructor(store: Store, method: string);
    constructor(payload: any, method?: string, descriptor?: PropertyDescriptor) {
        if (method) {
            //TODO need actual instance of class here....
            Action.register(payload[method].bind(payload));
            return;
        }

        this.trigger(payload);
    }

    public get payload() {
        return Math.random();
    }

    private trigger(payload: FakeData) {
        Action.methods.forEach(m => m(payload));
    }
}

但是,在构造函数内部,我无权访问商店的实际实例。我能够得到构造函数,但我不确定我是否能够使用它来实现我的目标。也许不是构造函数,我应该使所有商店严格静态?

我确定我没有以正确的方式思考这些装饰者,所以我们非常感谢您的见解!

Link to full code on Typescript Playground

1 个答案:

答案 0 :(得分:3)

看起来装饰器在定义类时调用,而不是实例化。这意味着为了使其工作,我必须将所有存储方法设置为静态,并且无法访问这些实例:

@Action
public static setData(data: FakeData) {
    console.log(this);
    this.state.data = data;
}

这里有完整的工作代码:

Typescript Playground