Get to know MDN better
This feature is well established and works across many devices and browser versions. It’s been available across browsers since March 2016.
The constructor method is a special method of a class for creating and initializing an object instance of that class.
Note: This page introduces the constructor syntax. For the constructor property present on all objects, see Object.prototype.constructor.
There are some additional syntax restrictions:
A constructor enables you to provide any custom initialization that must be done before any other methods can be called on an instantiated object.
If you don't provide your own constructor, then a default constructor will be supplied for you. If your class is a base class, the default constructor is empty:
If your class is a derived class, the default constructor calls the parent constructor, passing along any arguments that were provided:
Note: The difference between an explicit constructor like the one above and the default constructor is that the latter doesn't actually invoke the array iterator through argument spreading.
That enables code like this to work:
The ValidationError class doesn't need an explicit constructor, because it doesn't need to do any custom initialization. The default constructor then takes care of initializing the parent Error from the argument it is given.
However, if you provide your own constructor, and your class derives from some parent class, then you must explicitly call the parent class constructor using super(). For example:
Using new on a class goes through the following steps:
Within the constructor body, you can access the object being created through this and access the class that is called with new through new.target. Note that methods (including getters and setters) and the prototype chain are already initialized on this before the constructor is executed, so you can even access methods of the subclass from the constructor of the superclass. However, if those methods use this, the this will not have been fully initialized yet. This means reading public fields of the derived class will result in undefined, while reading private fields will result in a TypeError.
The constructor method may have a return value. While the base class may return anything from its constructor, the derived class must return an object or undefined, or a TypeError will be thrown.
If the parent class constructor returns an object, that object will be used as the this value on which class fields of the derived class will be defined. This trick is called "return overriding", which allows a derived class's fields (including private ones) to be defined on unrelated objects.
The constructor follows normal method syntax, so parameter default values, rest parameters, etc. can all be used.
The constructor must be a literal name. Computed properties cannot become constructors.
Async methods, generator methods, accessors, and class fields are forbidden from being called constructor. Private names cannot be called #constructor. Any member named constructor must be a plain method.
This code snippet is taken from the classes sample (live demo).
super() calls the constructor that's the prototype of the current class. If you change the prototype of the current class itself, super() will call the constructor that's the new prototype. Changing the prototype of the current class's prototype property doesn't affect which constructor super() calls.
| ECMAScript® 2027 Language Specification # sec-static-semantics-constructormethod |
Enable JavaScript to view this browser compatibility table.
This page was last modified on Jul 20, 2025 by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.