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

变量声明 usingvar提升,因此总是在其余代码之前评估。因此,这也可能导致问题:

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 回答
44

对我来说,这是ES6之间import的差异。require

例如

处理器.js

    class Processor {
    
    }
    
    export default Processor

index.js

const Processor = require('./processor');
const processor = new Processor() //fails with the error
    
import Processor from './processor'
const processor = new Processor() // succeed
于 2016-12-23T11:32:16.427 回答
28

我也四处搜索并找到了这个解决方案:

您在Project某处有一个不是函数的变量。然后new运营商会抱怨它。console.log(Project)在您将其用作构造器的地方尝试一下,您会找到它。

于 2012-04-11T13:51:48.767 回答
19

对于我的项目,问题原来是由 require() 调用创建的循环引用:

y.js:
var x = require("./x.js");
var y = function() { console.log("result is " + x(); }
module.exports = y;

x.js:
var y = require("./y.js");
var my_y = new y(); // <- TypeError: y is not a constructor
var x = function() { console.log("result is " + my_y; }
module.exports = x;

原因是当它试图初始化 y 时,它在依赖系统中创建了一个临时的“y”对象(不是类,对象!),它在某种程度上还不是构造函数。然后,当 x.js 完成定义后,它可以继续制作 ya 构造函数。只是,x.js 在尝试使用非构造函数 y 时出现错误。

于 2016-10-18T17:43:53.287 回答
14

我在一个文件中有一个类,我要导入到测试文件中:

//Vec.js
class Vec {

}

module.exports.Vec = Vec;

改变

//Vec.test.js
const Vec = require('./Vec');
const myVec = new Vec(); //TypeError: Vec is not a constructor

//Vec.test.js
const {Vec} = require('./Vec');
const myVec = new Vec(); //Succeeds!

为我解决了这个错误。

于 2019-12-04T16:43:36.357 回答
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 回答
4

要添加到@wprl 的答案,ES6 对象方法简写,如箭头函数,也不能用作构造函数。

const o = {
  a: () => {},
  b() {},
  c: function () {}
};

const { a, b, c } = o;

new a(); // throws "a is not a constructor"
new b(); // throws "b is not a constructor"
new c(); // works
于 2017-07-15T15:07:37.433 回答
4

汽车.js

class Car {
 getName() {return 'car'};
}
export default Car;

测试文件.js

const object = require('./Car.js');
const instance = new object();

错误:TypeError:实例不是构造函数

打印对象的内容

object = {default: Car}

将默认值附加到 require 函数,它将作为构造函数工作

const object = require('object-fit-images').default;
const instance = new object();
instance.getName();
于 2018-06-26T15:03:13.910 回答
4

我只想补充一点,如果从不同的文件调用构造函数,那么就像忘记导出构造函数一样简单

module.exports = NAME_OF_CONSTRUCTOR

也会导致“不是构造函数”异常。

于 2018-10-27T08:36:17.617 回答
2

在尝试将 BS5ModalJS 与 webpack 结合使用时,我遇到了类似的错误,这意味着我正在尝试导入 js 文件。

因为提供的单个 .js 文件设计为通过脚本标签使用,所以我花了一段时间才意识到为了避免“BSModal 不是构造函数”错误,我不得不进入他们的代码并添加:

export {BSModal}

然后我就可以使用

import { BSModal } from './../thirdparty/BS5ModalJS/BS5Modal.js';

让 myModal enter code here= new BSModal(...)

没有得到那个错误。

因此,如果您使用的是 webpack,也许要确保将类和函数导出(因此可用)给调用者。

于 2021-04-11T05:34:50.413 回答
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

我有一个类似的错误,我的问题是变量名称和构造函数名称的名称和大小写相同,这不起作用,因为 javascript 将预期的构造函数解释为新创建的变量。

换句话说:

function project(name){
    this.name = name;
}

//elsewhere...

//this is no good! name/case are identical so javascript barfs. 
let project = new project('My Project');

不过,只需更改大小写或变量名称即可解决问题:

//with a capital 'P'
function Project(name){
    this.name = name;
}

//elsewhere...

//works! class name/case is dissimilar to variable name
let project = new Project('My Project');
于 2017-09-22T20:29:18.160 回答
1

发生这种情况是因为您必须在代码中使用了另一个名为“project”的变量。就像是 var project = {}

为了使代码工作,更改如下:

var project = {}进入var project1 = {}

于 2017-12-26T17:19:50.640 回答
0

为了添加我在遇到这个问题时发现的解决方案,我包含了另一个文件中的一个类,而我试图在其中实例化它的文件给出了“不是构造函数”错误。最终问题是在定义类之前另一个文件中有几个未使用的要求。我不知道他们为什么把它弄坏了,但是把它们去掉就修复了。始终确保检查您正在考虑的步骤之间是否隐藏了某些东西。

于 2020-12-08T02:32:06.107 回答
0

在浏览中(假设您的应用程序正在运行),检查、获取并确保加载了构造函数的 javascript 文件。

于 2022-01-06T20:46:00.677 回答