--- title: class slug: Web/JavaScript/Reference/Statements/class page-type: javascript-statement browser-compat: javascript.statements.class sidebar: jssidebar --- The **`class`** declaration creates a {{Glossary("binding")}} of a new [class](/en-US/docs/Web/JavaScript/Reference/Classes) to a given name. You can also define classes using the [`class` expression](/en-US/docs/Web/JavaScript/Reference/Operators/class). {{InteractiveExample("JavaScript Demo: class declaration")}} ```js interactive-example class Polygon { constructor(height, width) { this.area = height * width; } } console.log(new Polygon(4, 3).area); // Expected output: 12 ``` ## Syntax ```js-nolint class name { // class body } class name extends otherName { // class body } ``` ## Description The class body of a class declaration is executed in [strict mode](/en-US/docs/Web/JavaScript/Reference/Strict_mode). The `class` declaration is very similar to {{jsxref("Statements/let", "let")}}: - `class` declarations are scoped to blocks as well as functions. - `class` declarations can only be accessed after the place of declaration is reached (see [temporal dead zone](/en-US/docs/Web/JavaScript/Reference/Statements/let#temporal_dead_zone_tdz)). For this reason, `class` declarations are commonly regarded as [non-hoisted](/en-US/docs/Glossary/Hoisting) (unlike [function declarations](/en-US/docs/Web/JavaScript/Reference/Statements/function)). - `class` declarations do not create properties on {{jsxref("globalThis")}} when declared at the top level of a script (unlike [function declarations](/en-US/docs/Web/JavaScript/Reference/Statements/function)). - `class` declarations cannot be [redeclared](/en-US/docs/Web/JavaScript/Reference/Statements/let#redeclarations) by any other declaration in the same scope. Outside the class body, `class` declarations can be re-assigned like `let`, but you should avoid doing so. Within the class body, the binding is constant like `const`. ```js class Foo { static { Foo = 1; // TypeError: Assignment to constant variable. } } class Foo2 { bar = (Foo2 = 1); // TypeError: Assignment to constant variable. } class Foo3 {} Foo3 = 1; console.log(Foo3); // 1 ``` ## Examples ### A class declaration In the following example, we first define a class named `Rectangle`, then extend it to create a class named `FilledRectangle`. Note that `super()`, used in the `constructor`, can only be used in constructors, and _must_ be called _before_ the `this` keyword can be used. ```js class Rectangle { constructor(height, width) { this.name = "Rectangle"; this.height = height; this.width = width; } } class FilledRectangle extends Rectangle { constructor(height, width, color) { super(height, width); this.name = "Filled rectangle"; this.color = color; } } ``` ## Specifications {{Specifications}} ## Browser compatibility {{Compat}} ## See also - [`function`](/en-US/docs/Web/JavaScript/Reference/Statements/function) - [`class` expression](/en-US/docs/Web/JavaScript/Reference/Operators/class) - [Classes](/en-US/docs/Web/JavaScript/Reference/Classes)