ECMAScript 6对抽象类有约定吗?

我很惊讶,在阅读 ES6时,我找不到任何关于抽象类的东西。(通过“抽象类”,我说的是它的 Java 含义,其中一个抽象类声明方法签名,子类必须实现这些签名才能实例化)。

有人知道在 ES6中实现抽象类的约定吗?如果能够通过静态分析捕获抽象类冲突就好了。

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

102255 次浏览

ES2015没有为您所需的设计模式提供内置启示的 Java 样式的类。然而,它有一些选项可能是有帮助的,这取决于你到底想要完成什么。

如果您想要一个无法构造但其子类可以构造的类,那么您可以使用 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