MDN’s new design is in Beta! A sneak peek:

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. 


class name [extends] {
  // class body


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).


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) { = 'Polygon';
    this.height = height;
    this.width = width;

class Square extends Polygon {
  constructor(length) {
    super(length, length); = '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


Specification Status Comment
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Class definitions' in that specification.
Standard Initial definition.
ECMAScript Latest Draft (ECMA-262)
The definition of 'Class definitions' in that specification.

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

See also

Document Tags and Contributors

 Last updated by: KiltedViking,