The class declaration creates a new class with a given name using prototype-based inheritance.
You can also define a class using a class expression. But unlike the class expression, the class declaration doesn't allow an existing class to be declared again and will throw a type error if attempted.
Syntax
class name [extends] { // class body }
Description
Just like with class expressions, the class body of a class declaration is executed in strict mode. The constructor property is optional.
Class declarations are not hoisted (unlike function declarations).
Examples
A simple class declaration
In the following example, we first define a class named Polygon, then extend it to create a class named Square. Note that super(), used in the constructor, can only be used in constructors and must be called before the this keyword can be used.
class Polygon { constructor(height, width) { this.name = 'Polygon'; this.height = height; this.width = width; } } class Square extends Polygon { constructor(length) { super(length, length); this.name = 'Square'; } }
Attempting to declare a class twice
Re-declaring a class using the class declartion throws a type error.
class Foo {}; class Foo {}; // Uncaught TypeError: Identifier 'Foo' has already been declared
The same error is thrown when a class has been defined before using the class expression.
var Foo = class {}; class Foo {}; // Uncaught TypeError: Identifier 'Foo' has already been declared
Specifications
Specification | Status | Comment |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'Class definitions' in that specification. |
Standard | Initial definition. |
ECMAScript 2016 (ECMA-262) The definition of 'Class definitions' in that specification. |
Standard | |
ECMAScript 2017 (ECMA-262) The definition of 'Class definitions' in that specification. |
Standard | |
ECMAScript Latest Draft (ECMA-262) The definition of 'Class definitions' in that specification. |
Living Standard |
Browser compatibility
Feature | Chrome | Edge | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
Basic support | 42.0 | (Yes) | 45 (45) | ? | ? | 10.1 |
Array subclassing | 43.0 | ? | No support | ? | ? | ? |
Allowed in sloppy mode | 49.0 | ? |
Feature | Android | Android Webview | Edge | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile | Chrome for Android |
---|---|---|---|---|---|---|---|---|
Basic support | No support | 42.0 | (Yes) | 45.0 (45) | ? | ? | ? | 42.0 |
Array subclassing | No support | 43.0 | ? | No support | ? | ? | ? | 43.0 |
Allowed in sloppy mode | No support | 49.0 | ? | 49.0 |