JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptの「is not a constructor」エラーとは?原因と解決方法をわかりやすく解説


JavaScriptで「TypeError: 〇〇 is not a constructor(コンストラクターではありません)」というエラーが発生するのは、コンストラクターとして呼び出せないオブジェクトや変数に対して new 演算子を使った場合です。

たとえば、数値や文字列などのプリミティブ値、あるいはアロー関数new によるインスタンス化に対応していないため、このエラーがスローされます。

エラーが発生するコード例

以下は、数値型の変数をコンストラクターとして呼び出し、「not a constructor」エラーを発生させるサンプルコードです。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
    body {
        font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
    }
    .result {
        font-size: 18px;
        font-weight: 500;
        color: rebeccapurple;
    }
</style>
</head>
<body>
<h1>Not a constructor function error</h1>
<div class="result"></div>
<button class="Btn">CLICK HERE</button>
<h3>上のボタンをクリックすると、変数をコンストラクターとして使用します</h3>
<script>
    let resEle = document.querySelector(".result");
    let BtnEle = document.querySelector(".Btn");
    let b = 22;
    BtnEle.addEventListener("click", () => {
        try {
            new b();
        }
        catch (err) {
            resEle.innerHTML = err;
        }
    });
</script>
</body>
</html>

実行結果

上記のコードを実行すると、最初は次のように表示されます。

JavaScriptの「is not a constructor」エラーとは?原因と解決方法をわかりやすく解説

「CLICK HERE」ボタンをクリックすると、次のようにエラーメッセージが表示されます。

JavaScriptの「is not a constructor」エラーとは?原因と解決方法をわかりやすく解説

ここでは、値が 22 の変数 b に対して new b() を実行しています。数値などのプリミティブ値にはコンストラクターとしての機能がないため、try...catch ブロックによって捕捉された「TypeError: b is not a constructor」というエラーが画面に出力されるのです。

このエラーが起きる主なケースと対処法

  • プリミティブ値に new を使っている:数値・文字列・真偽値などには new を使えません。オブジェクトや関数に対してのみ使用しましょう。
  • アロー関数を new で呼び出している:アロー関数はコンストラクターとして動作しないため、通常の function 宣言またはクラスに書き換える必要があります。
  • モジュールのインポートミスexport default と名前付きエクスポートの取り違えにより、実際には関数以外のものを読み込んでいる場合にも発生します。import の対象を確認しましょう。

  1. JavaScriptの関数プロトタイプとは?仕組みと使い方を解説

    JavaScriptで作成されたすべての関数には、JavaScriptエンジンによって自動的にprototypeプロパティが追加されます。このprototypeプロパティはオブジェクトであり、デフォルトではconstructorプロパティを含んでいます。関数のプロトタイプには、以下のようにしてアクセスできます。functionName.prototypeコンストラクタ関数を使ってオブジェクトを生成する場合、このprototypeプロパティを活用することで、同じコンストラクタから作成された複数のオブジェクト間でメソッドやプロパティを効率的に共有することができます。これにより、各インスタンスごとに

  2. JavaScriptでのメソッド借用:call()・apply()・bind()の使い方を解説

    JavaScriptでは、call()、apply()、bind()という3つのメソッドを使うことで、あるオブジェクトが持つメソッドを別のオブジェクトが「借用」できます。これは、本来そのメソッドを持たないオブジェクトに対して、thisの参照先を差し替えてメソッドを実行できる便利なテクニックです。 3つのメソッドの違い call():引数をカンマ区切りで個別に渡し、即座に関数を実行します。 apply():引数を配列(または配列風オブジェクト)として渡し、即座に関数を実行します。 bind():thisを固定した新しい関数を返すだけで、即座には実行されません。返された関数は後から好きなタイミン