当读到ES6时,我很惊讶我找不到任何关于抽象类的东西。 (通过“抽象类”我正在谈论它的Java含义,其中抽象类声明子类必须实现的方法签名才能实例化)。ECMAScript 6是否具有抽象类的约定?
有谁知道在ES6中实现抽象类的任何约定吗?能够通过静态分析来捕捉抽象类违规将会很好。
如果我在运行时提出一个错误信号表示抽象类实例的尝试,那么错误是什么?
当读到ES6时,我很惊讶我找不到任何关于抽象类的东西。 (通过“抽象类”我正在谈论它的Java含义,其中抽象类声明子类必须实现的方法签名才能实例化)。ECMAScript 6是否具有抽象类的约定?
有谁知道在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
ES6不会更改早期JavaScript版本的基本原型继承机制。 “抽象类”的概念在JavaScript中没有太多意义,尽管预处理器类型的语言当然可以实现这样的事情。 – Pointy
由于JavaScript不是强类型抽象类将不会有用。 – gorgi93
抽象类以及特征和mixin是一个待处理的[“strawman”](http://wiki.ecmascript.org/doku.php?id=strawman:strawman)[proposal](http://wiki.ecmascript ?.ORG/doku.php ID =稻草人:trait_composition_for_classes)。 –