TypeError: "x" is not a constructor
JavaScript 异常“不是构造函数”发生在尝试将对象或变量用作构造函数,但该对象或变量不是构造函数时。
消息
TypeError: x is not a constructor (V8-based & Firefox & Safari)
错误类型
TypeError
哪里出错了?
尝试将对象或变量用作构造函数,但该对象或变量不是构造函数。有关什么是构造函数,请参阅构造函数或new 运算符。
有许多全局对象,如String或Array,它们可以使用new构造。然而,有些全局对象不是,它们的属性和方法是静态的。以下 JavaScript 标准内置对象不是构造函数:Math、JSON、Symbol、Reflect、Intl、Atomics。
生成器函数也不能用作构造函数。
示例
无效案例
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());
}