127

私はこのようなオブジェクトを定義しています:

function Project(Attributes, ProjectWidth, ProjectHeight) {
    this.ProjectHeight = ProjectHeight;
    this.ProjectWidth = ProjectWidth;
    this.ProjectScale = this.GetProjectScale();
    this.Attributes = Attributes;

    this.currentLayout = '';

    this.CreateLayoutArray = function()
    {....}
}

次に、次のようなインスタンスを作成しようとします。

var newProj = new Project(a,b,c);

しかし、この例外がスローされます:

Project is not a constructor

何が間違っている可能性がありますか?私はたくさんグーグルで調べましたが、何が間違っているのかまだわかりません。

4

17 に答える 17

102

Projectユーザー定義関数/有効なコンストラクターではないため、質問に投稿されたコードはそのエラーを生成できません。

function x(a,b,c){}
new x(1,2,3);               // produces no errors

あなたはおそらく次のようなことをしたことがあります:

function Project(a,b,c) {}
Project = {};               // or possibly   Project = new Project
new Project(1,2,3);         // -> TypeError: Project is not a constructor

を使用した変数宣言var巻き上げられるため、常に残りのコードよりも先に評価されます。したがって、これも問題を引き起こす可能性があります。

function Project(){}
function localTest() {
    new Project(1,2,3); // `Project` points to the local variable,
                        // not the global constructor!

   //...some noise, causing you to forget that the `Project` constructor was used
    var Project = 1;    // Evaluated first
}
于 2012-04-11T13:49:59.953 に答える
75

これの追加の原因は、ES2015アロー関数である可能性があります。 コンストラクターとして使用することはできません

const f = () => {};
new f(); // This throws "f is not a constructor"
于 2016-05-04T20:40:26.860 に答える
28

私もグーグルで調べて、この解決策を見つけました:

Project関数ではない変数がどこかにあります。そうすれば、newオペレーターはそれについて文句を言います。console.log(Project)コンストラクターとして使用する場所で試してみると、それが見つかります。

于 2012-04-11T13:51:48.767 に答える
12

私の場合、プロトタイプ名をオブジェクト名として使用していました。例えば

function proto1()
{}

var proto1 = new proto1();

ばかげた間違いでしたが、私のような人には役立つかもしれません;)

于 2016-07-31T14:55:15.997 に答える
6

場合によっては、それをエクスポートおよびインポートする方法だけです。このエラー メッセージの場合、デフォルトのキーワードが欠落している可能性があります。

export default SampleClass {}

インスタンス化する場所:

import SampleClass from 'path/to/class';
let sampleClass = new SampleClass();

オプション 2、中かっこ付き:

export SampleClass {}
import { SampleClass } from 'path/to/class';
let sampleClass = new SampleClass();
于 2020-03-03T20:12:27.837 に答える
1

私の場合、エクスポートされたモジュール内のすべてのコードをラップする関数の定義の最後にある開き括弧と閉じ括弧を忘れていました。つまり、私は持っていました:

(function () {
  'use strict';

  module.exports.MyClass = class{
  ...
);

それ以外の:

(function () {
  'use strict';

  module.exports.MyClass = class{
  ...
)();

コンパイラは文句を言いませんが、インポートモジュールのrequireステートメントは割り当てられている変数を設定していないため、構築しようとした時点では未定義であり、TypeError: MyClass is not a constructorエラーが発生します.

于 2017-03-03T02:24:03.553 に答える
1

これは、コードで「project」という名前の別の変数を使用したに違いないために発生しています。何かのようなもの var project = {}

コードを機能させるには、次のように変更します。

var project = {}の中へvar project1 = {}

于 2017-12-26T17:19:50.640 に答える