ECMAScript 6是否有抽象类约定?

obe*_*lia 151 javascript oop abstract-class ecmascript-6

我很惊讶在阅读ES6时我找不到关于抽象类的任何内容.(通过"抽象类"我正在谈论它的Java含义,其中抽象类声明了子类必须实现的方法签名才能实现可实现化).

有没有人知道在ES6中实现抽象类的任何约定?能够通过静态分析捕获抽象类违规会很好.

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

Dom*_*nic 280

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
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息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
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.但我不认为你应该把它标记为副本,因为1)这是一个不同的问题,2)对另一个问题的接受答案是对我的问题的错误答案; 3)我的问题首先被问到.我看到AWB的回答(对另一个问题)在这里回答了我的问题,但未被标记为已接受的答案. (18认同)
  • 刚刚发现Safari不支持`new.target`.转换后的代码抛出:`SyntaxError:Unexpected token'.'` (5认同)
  • 如果你写 throw new TypeError(“无法直接构造” + new.target.name + “实例”); 它将变得更加重构友好。 (3认同)