2015-04-06 45 views
101

当读到ES6时,我很惊讶我找不到任何关于抽象类的东西。 (通过“抽象类”我正在谈论它的Java含义,其中抽象类声明子类必须实现的方法签名才能实例化)。ECMAScript 6是否具有抽象类的约定?

有谁知道在ES6中实现抽象类的任何约定吗?能够通过静态分析来捕捉抽象类违规将会很好。

如果我在运行时提出一个错误信号表示抽象类实例的尝试,那么错误是什么?

+4

ES6不会更改早期JavaScript版本的基本原型继承机制。 “抽象类”的概念在JavaScript中没有太多意义,尽管预处理器类型的语言当然可以实现这样的事情。 – Pointy

+1

由于JavaScript不是强类型抽象类将不会有用。 – gorgi93

+0

抽象类以及特征和mixin是一个待处理的[“strawman”](http://wiki.ecmascript.org/doku.php?id=strawman:strawman)[proposal](http://wiki.ecmascript ?.ORG/doku.php ID =稻草人:trait_composition_for_classes)。 –

回答

191

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 
+8

谢谢。但我认为你不应该把它标为重复,因为1)这是一个不同的问题,2)对另一个问题的接受答案是对我的问题的错误答案,3)我的问题首先被问到。我看到AWB的答案(对另一个问题)在这里回答我的问题,但未被标记为接受的答案。 – obelia

+0

另一个问题是获得更多更好的答案,并且实质上是相同的。呃,好吧。 – Domenic

+4

刚发现Safari不支持'new.target'。经过编译的代码将抛出:'SyntaxError:Unexpected token'。'' – siannone