TypeError: "x" 不是构造函数

JavaScript 异常 "不是构造函数" 出现在尝试使用对象或变量作为构造函数时,但该对象或变量不是构造函数。

消息

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

错误类型

哪里出了问题?

尝试使用对象或变量作为构造函数,但该对象或变量不是构造函数。有关构造函数的更多信息,请参阅 构造函数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
const fn = () => {
  return new Promise.resolve(true);
};

这是合法的,但过于冗长

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

而是返回静态方法

js
const resolveAlways = () => {
  return Promise.resolve(true);
};

const rejectAlways = () => {
  return Promise.reject(false);
};

另请参阅