ECMAScript 6 是否有抽象类的约定?
2022-08-30 01:38:59
我很惊讶,在阅读ES6时,我找不到任何关于抽象类的东西。(通过“抽象类”,我谈论的是它的Java含义,其中抽象类声明子类必须实现才能实例化的方法签名)。
有谁知道在ES6中实现抽象类的任何约定?如果能够通过静态分析捕获抽象类冲突,那就太好了。
如果我在运行时引发错误以发出尝试抽象类实例化的信号,那么错误会是什么?
我很惊讶,在阅读ES6时,我找不到任何关于抽象类的东西。(通过“抽象类”,我谈论的是它的Java含义,其中抽象类声明子类必须实现才能实例化的方法签名)。
有谁知道在ES6中实现抽象类的任何约定?如果能够通过静态分析捕获抽象类冲突,那就太好了。
如果我在运行时引发错误以发出尝试抽象类实例化的信号,那么错误会是什么?
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