ECMAScript 6 是否有抽象 类 的约定?
Does ECMAScript 6 have a convention for abstract classes?
我很惊讶在阅读 ES6 时找不到任何关于抽象 classes 的信息。 ("abstract class" 我说的是它的 Java 含义,其中抽象 class 声明子 class 必须实现的方法签名才能实例化) .
有人知道在 ES6 中实现抽象 classes 的任何约定吗?如果能够通过静态分析捕获抽象 class 违规,那就太好了。
如果我要在运行时引发错误以表示尝试抽象 class 实例化,错误会是什么?
ES2015 没有 Java-style classes 为你想要的设计模式提供内置功能。但是,它有一些选项可能会有所帮助,具体取决于您要完成的目标。
如果您想要一个无法构造但其子class可以构造的class,那么您可以使用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
, you may want to read this general overview of how classes in ES2015 work: http://www.2ality.com/2015/02/es6-classes-final.html
的更多详细信息
如果您特别需要实现某些方法,您也可以在 superclass 构造函数中进行检查:
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 时找不到任何关于抽象 classes 的信息。 ("abstract class" 我说的是它的 Java 含义,其中抽象 class 声明子 class 必须实现的方法签名才能实例化) .
有人知道在 ES6 中实现抽象 classes 的任何约定吗?如果能够通过静态分析捕获抽象 class 违规,那就太好了。
如果我要在运行时引发错误以表示尝试抽象 class 实例化,错误会是什么?
ES2015 没有 Java-style classes 为你想要的设计模式提供内置功能。但是,它有一些选项可能会有所帮助,具体取决于您要完成的目标。
如果您想要一个无法构造但其子class可以构造的class,那么您可以使用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
, you may want to read this general overview of how classes in ES2015 work: http://www.2ality.com/2015/02/es6-classes-final.html
如果您特别需要实现某些方法,您也可以在 superclass 构造函数中进行检查:
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