TypeError: "x" is not a constructor
JavaScript の例外 "is not a constructor" は、オブジェクトや変数をコンストラクターとして使用しようとしたものの、そのオブジェクトや変数がコンストラクターではなかった場合に発生します。
エラーメッセージ
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: Atomics is not a constructor
エラーの種類
エラーの原因
オブジェクトや変数をコンストラクターとして使おうとしていますが、それらがコンストラクターではありません。コンストラクターとは何かについては、コンストラクターまたは new
演算子を参照してください。
String
や Array
のような、 new
を使用して生成できる数多くのグローバルオブジェクトがあります。しかし、いくつかのグローバルオブジェクトはそうではなく、それらのプロパティやメソッドは静的です。次の JavaScript 標準組み込みオブジェクトのうち、 Math
、JSON
、Symbol
、Reflect
、Intl
、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
と呼び、 make, model, year の各プロパティを持つようにしたいとします。これを実現するには、次のような関数を定義します。
function Car(make, model, year) { this.make = make; this.model = model; this.year = year; }
次のようにして mycar
というオブジェクトを生成できるようになりました。
var mycar = new Car("Eagle", "Talon TSi", 1993);
プロミスの場合
ただちに解決するか拒否されるプロミスを返す場合は、 new Promise(...) を生成して操作する必要はありません。
これは正しくなく (Promise コンストラクターが正しく呼び出されません)、 TypeError: this is not a constructor
例外が発生します。
return new Promise.resolve(true);
代わりに、 Promise.resolve() または Promise.reject() の静的メソッドを使用してください。
// This is legal, but unnecessarily long: return new Promise((resolve, reject) => { resolve(true); }) // Instead, return the static method: return Promise.resolve(true); return Promise.reject(false);