ECMAScript 6是否具有抽象类的约定?

我很惊讶,在ES6上阅读时我找不到有关抽象类的东西。 (通过“抽象类”我正在谈论它的Java的含义,其中抽象类声明子类必须实现的方法签名才能实例化)。

有没有人知道在ES6中实施抽象类的任何约定? 能够用静态分析来捕捉抽象类违规将会很好。

如果我在运行时提出一个错误来指示抽象类实例的尝试,那么错误是什么?

ES2015没有Java风格的类,内置了你想要的devise模式。 但是,它有一些可能有用的选项,具体取决于您要完成的工作。

如果你想要一个不能被构造的类,但是它的子类可以,那么你可以使用new.target

 class Abstract { constructor() { if (new.target === Abstract) { throw new TypeError("Cannot construct Abstract instances directly"); } } } class Derived extends Abstract { constructor() { super(); // more Derived-specific stuff here, maybe } } const a = new Abstract(); // new.target is Abstract, so it throws const b = new Derived(); // new.target is Derived, so no error 

有关new.target更多详细信息,您可能需要阅读ES2015中的类的一般概述: http ://www.2ality.com/2015/02/es6-classes-final.html

如果你正在寻找特定的方法来实现,你也可以在超类的构造函数中检查:

 class Abstract { constructor() { if (this.method === undefined) { // or maybe test typeof this.method === "function" throw new TypeError("Must override method"); } } } class Derived1 extends Abstract {} class Derived2 extends Abstract { method() {} } const a = new Abstract(); // this.method is undefined; error const b = new Derived1(); // this.method is undefined; error const c = new Derived2(); // this.method is Derived2.prototype.method; no error