TypeError: "x" не является конструктором
Исключение JavaScript "is not a constructor" возникает, когда была предпринята попытка использовать объект или переменную в качестве конструктора, но этот объект или переменная конструктором не является.
Сообщение
TypeError: x is not a constructor (V8-based & Firefox & Safari)
Тип ошибки
Что пошло не так?
Была предпринята попытка использовать объект или переменную в качестве конструктора, но этот объект или переменная конструктором не является. См. constructor или оператор new для получения дополнительной информации о том, что такое конструктор.
Существует множество глобальных объектов, таких как String или Array, которые могут быть сконструированы с использованием new. Однако некоторые глобальные объекты таковыми не являются, и их свойства и методы статичны. Следующие стандартные встроенные объекты JavaScript не являются конструкторами: Math, JSON, Symbol, Reflect, Intl, Atomics.
Функции-генераторы также не могут использоваться в качестве конструкторов.
Примеры
Неверные случаи
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
Конструктор автомобиля
Предположим, вы хотите создать тип объекта для автомобилей. Вы хотите, чтобы этот тип объекта назывался Car, и чтобы он имел свойства для марки, модели и года. Для этого вы должны написать следующую функцию:
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
Теперь вы можете создать объект под названием myCar следующим образом:
const myCar = new Car("Eagle", "Talon TSi", 1993);
В промисах (Promises)
При возвращении немедленно разрешенного или немедленно отклоненного Promise вам не нужно создавать new Promise(...) и действовать в соответствии с ним. Вместо этого используйте Promise.resolve() или Promise.reject() статические методы.
Это не является допустимым (конструктор Promise вызывается некорректно) и вызовет исключение TypeError: this is not a constructor:
function fn() {
return new Promise.resolve(true);
}
Это допустимо, но неоправданно длинно:
function fn() {
return new Promise((resolve, reject) => {
resolve(true);
});
}
Вместо этого верните статический метод:
function resolveAlways() {
return Promise.resolve(true);
}
function rejectAlways() {
return Promise.reject(new Error());
}
См. также
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Not_a_constructor