在ES6中委派类方法时出错

时间:2020-11-05 23:11:41

标签: javascript ecmascript-6 es6-class

我有这个UseCase类:

class UseCase {

    constructor(repository) {
        this.repository = repository;
    }

    execute() {
      //do stuff
    }

}

module.exports = UseCase;

和此Service类:

class Service {

    constructor(repository) {
        this.useCase = new UseCase(repository);
    }

    doWork = this.useCase.execute;

}

module.exports = Service;

我想要的是对service.doWork()的委托useCase.execute()调用,但是当我执行它时,出现此错误:

TypeError:无法读取未定义的属性“ execute”

但是,如果我将Service代码更改为此:

class Service {

    constructor(repository) {
        this.repository = repository;
    }

    doWork = new UseCase(this.repository).execute;

}

module.exports = Service;

它正常工作!这是为什么?我想念什么?

1 个答案:

答案 0 :(得分:2)

类字段在构造函数可以运行之后立即运行,在任何super调用之后(如果有)立即运行。您的代码等效于:

class Service {
    constructor(repository) {
        this.doWork = this.useCase.execute;
        this.useCase = new UseCase(repository);
    }
}

没有及时定义。

在分配给doWork之后,将useCase放入构造函数中。

您还需要确保在正确的调用上下文中调用.execute-仅传递this.useCase.execute会丢失useCase的调用上下文。

class Service {
    constructor(repository) {
        this.useCase = new UseCase(repository);
        this.doWork = () => this.useCase.execute();
    }
}

您还可以使用在调用时调用.execute的类字段:

class Service {
    constructor(repository) {
        this.useCase = new UseCase(repository);
    }
    doWork = () => this.useCase.execute();
}