TypeError: "x" is not a constructor
Сообщение
TypeError: Object doesn't support this action (Edge) TypeError: "x" is not a constructor TypeError: Math is not a constructor TypeError: JSON is not a constructor TypeError: Symbol is not a constructor TypeError: Reflect is not a constructor TypeError: Intl is not a constructor TypeError: SIMD is not a constructor TypeError: Atomics is not a constructor
Тип ошибки
Что пошло не так?
Была попытка использовать объект или переменную как конструктор, однако этот объект или переменная - не конструктор. Смотрите constructor или new
operator, чтобы получить больше информации о том, что такое конструктор.
Существует множество глобальных объектов, таких как String
или Array
, которые можно построить с использованием new
. Однако, некоторые глобальные объекты - нельзя, т.к. их свойства и методы статичны. Следующие стандартные встроенные объекты JavaScript - не конструкторы: Math
, JSON
, Symbol
, Reflect
, Intl
, SIMD
, Atomics
.
Функции-генераторы также не могут быть использованы как конструкторы.
Примеры
Неправильное использование
var 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() {}
var obj = new f();
// TypeError: f is not a constructor
Конструктор "car" (автомобиль)
Представьте, что вы хотите создать тип объекта для автомобилей. Вы хотите, чтобы этот тип объектов назывался car
, и вы хотите, чтобы были свойства для производителя, модели и года выпуска. Чтобы сделать это, вы должны написать следующую функцию:
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
Теперь вы можете создать объект, который называется mycar
(мой автомобиль) следующим образом:
var mycar = new Car("Лада", "Самара", 1993);
В Промисах
В случае, когда возвращается незамедлительно разрешённый или незамедлительно отклонённый промис, вам не нужно создавать новый промис new Promise(...) и работать с ним.
Это неправильно (конструктор Promise вызывается неправильно) и будет вызывать исключение TypeError: this is not a constructor
:
return new Promise.resolve(true);
Вместо этого используйте статические методы - Promise.resolve() или Promise.reject() :
// Это допустимо, но слишком длинно, в этом нет необходимости:
return new Promise((resolve, reject) => {
resolve(true);
});
// Вместо этого, возвращайте статический метод:
return Promise.resolve(true);
return Promise.reject(false);