このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

View in English Always switch to English

TypeError: "x" is not a constructor

JavaScript の例外 "is not a constructor" は、オブジェクトや変数をコンストラクターとして使用しようとしたものの、そのオブジェクトや変数がコンストラクターではなかった場合に発生します。

エラーメッセージ

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 コンストラクター

自動車のためのオブジェクト型を作成するとします。このオブジェクト型を Car と呼び、 make, model, year の各プロパティを持つようにしたいとします。これを実現するには、次のような関数を定義します。

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);

プロミスの場合

ただちに解決するか拒否されるプロミスを返す場合は、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());
}

関連情報