Сообщение

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

Тип ошибки

TypeError

Что пошло не так?

Была попытка использовать объект или переменную как конструктор, однако этот объект или переменная - не конструктор. Смотрите 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);

В Обещаниях (Promises)

В случае, когда возвращается незамедлительно разрешенное или незамедлительно отклоненное Обещание, Вам не нужно создавать новое Обещание new 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);

Смотрите также

Метки документа и участники

Метки: 
Внесли вклад в эту страницу: grebenyukov
Обновлялась последний раз: grebenyukov,