Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ECMAScript 6是否有抽象类的约定?_Javascript_Oop_Abstract Class_Ecmascript 6 - Fatal编程技术网

Javascript ECMAScript 6是否有抽象类的约定?

Javascript ECMAScript 6是否有抽象类的约定?,javascript,oop,abstract-class,ecmascript-6,Javascript,Oop,Abstract Class,Ecmascript 6,在阅读ES6时,我发现自己找不到任何关于抽象类的东西,这让我很惊讶。(通过“抽象类”,我指的是它的Java含义,其中抽象类声明子类必须实现的方法签名才能实例化) 有人知道在ES6中实现抽象类的任何约定吗?如果能够通过静态分析捕获抽象类冲突,那就太好了 如果我在运行时引发一个错误来表示试图进行抽象类实例化,那么错误会是什么 ES2015没有Java风格的类,这些类为您所需的设计模式提供了内置的功能。但是,它有一些可能有用的选项,具体取决于您要完成的任务 如果您想要一个无法构造但其子类可以构造的类,

在阅读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
有关的更多详细信息,您可能希望阅读ES2015中类如何工作的概述:

如果您特别希望实现某些方法,也可以在超类构造函数中检查:

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术语中并没有多大意义,尽管预处理器类型的语言肯定可以实现这一点。因为JavaScript不是强类型的抽象类,所以抽象类没有用处。抽象类,以及traits和mixin,是挂起的。@gorgi93-抽象类与强类型无关。自20世纪70年代以来,像Smalltalk这样的动态类型语言(按照惯例)就已经有了抽象类。(派对晚些时候)我要站在你们一边,这不是一个重复的问题。它会经常被问到,即使它下面是同一只野兽。JS类与ruby类有些相似。如果没有实现某些东西,我会使用类似的方法抛出错误,但不检查实例化(许多ruby开发人员也这样做)。在我看来,这是一个清晰的代码。创建一个NotImplementedClass。然后在基类中
mymethod(){throw new NotImplementedError()}
谢谢。但我认为你不应该把这个标记为重复,因为1)这是一个不同的问题,2)另一个问题的公认答案是我问题的错误答案,3)我的问题是先问的。我看到AWB的答案(对另一个问题)在这里回答了我的问题,但没有标记为已接受的答案。刚刚发现Safari不支持
new.target
。传输的代码抛出:
SyntaxError:Unexpected token'.
new.target在最新的babel中受支持,从29开始。2016年4月:@siannone MDN表示,如果您编写抛出新类型错误(“无法直接构造”+new.target.name+“实例”),safari支持new.target;它将变得更易于重构。