我很惊讶在阅读 ES6 时找不到任何关于抽象类的信息。(我所说的“抽象类”是指它的 Java 含义,其中抽象类声明了子类必须实现的方法签名才能实例化)。
有谁知道在 ES6 中实现抽象类的任何约定?能够通过静态分析捕获抽象类违规会很好。
如果我要在运行时引发错误以表示尝试抽象类实例化,那么错误会是什么?
ES2015 没有 Java 风格的类,它们为您想要的设计模式提供内置功能。但是,它有一些可能会有所帮助的选项,具体取决于您要完成的工作。
如果您想要一个无法构造的类,但其子类可以,那么您可以使用new.target:
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