TypeError: "x" is not a constructor

JavaScript 异常“不是构造函数”发生在尝试将对象或变量用作构造函数,但该对象或变量不是构造函数时。

消息

TypeError: x is not a constructor (V8-based & Firefox & Safari)

错误类型

TypeError

哪里出错了?

尝试将对象或变量用作构造函数,但该对象或变量不是构造函数。有关什么是构造函数,请参阅构造函数new 运算符

有许多全局对象,如StringArray,它们可以使用new构造。然而,有些全局对象不是,它们的属性和方法是静态的。以下 JavaScript 标准内置对象不是构造函数:MathJSONSymbolReflectIntlAtomics

生成器函数也不能用作构造函数。

示例

无效案例

js
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,并且您希望它具有制造厂、型号和年份的属性。为此,您将编写以下函数

js
function Car(make, model, year) {
  this.make = make;
  this.model = model;
  this.year = year;
}

现在你可以按如下方式创建名为 myCar 的对象

js
const myCar = new Car("Eagle", "Talon TSi", 1993);

在 Promise 中

当返回一个立即解决或立即拒绝的 Promise 时,您无需创建new Promise(...)并对其进行操作。相反,请使用Promise.resolve()Promise.reject()静态方法

这是非法的(Promise 构造函数未正确调用),并将抛出TypeError: this is not a constructor异常

js
function fn() {
  return new Promise.resolve(true);
}

这是合法的,但没有必要冗长

js
function fn() {
  return new Promise((resolve, reject) => {
    resolve(true);
  });
}

相反,返回静态方法

js
function resolveAlways() {
  return Promise.resolve(true);
}

function rejectAlways() {
  return Promise.reject(new Error());
}

另见