The JavaScript exception "is not a constructor" occurs when there was an attempt to use an object or a variable as a constructor, but that object or variable is not a constructor.
Message
TypeError: x is not a constructor (V8-based & Firefox & Safari)
Error type
What went wrong?
There was an attempt to use an object or a variable as a constructor, but that object
or variable is not a constructor. See constructor
or the new
operator
for more information on what a constructor is.
There are many global objects, like String or Array, which
are constructable using new
. However, some global objects are not and their
properties and methods are static. The following JavaScript standard built-in objects
are not a constructor: Math, JSON, Symbol,
Reflect, Intl, Atomics.
Generator functions cannot be used as constructors either.
Examples
Invalid cases
const Car = 1;
new Car();
// TypeError: Car is not a constructor
new Math();
// TypeError: Math is not a constructor
new Symbol();
// TypeError: Symbol is not a constructor
function* f() {}
const obj = new f();
// TypeError: f is not a constructor
A car constructor
Suppose you want to create an object type for cars. You want this type of object to be
called Car
, and you want it to have properties for make, model, and year.
To do this, you would write the following function:
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
Now you can create an object called mycar
as follows:
const mycar = new Car("Eagle", "Talon TSi", 1993);
In Promises
When returning an immediately-resolved or immediately-rejected Promise, you do not need to create a new Promise(...)
and act on it. Instead, use the Promise.resolve()
or Promise.reject()
static methods.
This is not legal (the Promise
constructor is not being called correctly) and will throw a TypeError: this is not a constructor
exception:
const fn = () => {
return new Promise.resolve(true);
};
This is legal, but unnecessarily long:
const fn = () => {
return new Promise((resolve, reject) => {
resolve(true);
});
};
Instead, return the static method:
const resolveAlways = () => {
return Promise.resolve(true);
};
const rejectAlways = () => {
return Promise.reject(false);
};