Javascript“Not a Constructor”创建对象时出现异常

时间:2012-04-11 13:44:51

标签: javascript object constructor typeerror

我正在定义一个这样的对象:

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

可能有什么不对?我搜索了很多,但仍然无法弄清楚我做错了什么。

17 个答案:

答案 0 :(得分:74)

问题中发布的代码无法生成该错误,因为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的变量声明为hoisted,因此始终在其余代码之前进行评估。所以,这也可能导致问题:

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
}

答案 1 :(得分:40)

另一个原因可能是ES2015 arrow functions他们不能用作构造函数

const f = () => {};
new f(); // This throws "f is not a constructor"

答案 2 :(得分:20)

对我而言,ES6上的importrequire之间存在差异。

E.g。

// processor.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() // succeeds

答案 3 :(得分:19)

我也在谷歌上搜索并找到了这个解决方案:

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

答案 4 :(得分:11)

对于我的项目,问题结果是由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时,它会创建一个临时的&#34; y&#34;依赖系统中的对象(不是类,对象!),它在某种程度上还不是构造函数。然后,当x.js完成定义时,它可以继续使y成为构造函数。只有,x.js在其中尝试使用非构造函数y时出错。

答案 5 :(得分:9)

在我的情况下,我使用原型名称作为对象名称。例如,

function proto1()
{}

var proto1 = new proto1();

这是一个愚蠢的错误,但可能对像我这样的人有帮助;)

答案 6 :(得分:4)

有时候,这只是您导出和导入它的方式。对于此错误消息,可能是缺少默认关键字的。

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

答案 7 :(得分:2)

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

netstat -an

答案 8 :(得分:2)

我只想补充一下,如果从另一个文件中调用构造函数,那么就像忘记使用

导出构造函数一样简单
module.exports = NAME_OF_CONSTRUCTOR

还将导致“不是构造函数”异常。

答案 9 :(得分:1)

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

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

export {BSModal}

然后我就可以使用

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

然后做

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

没有得到那个错误。

因此,如果您正在使用 webpack,请确保将类和函数导出(并因此可用)给调用者。

答案 10 :(得分:1)

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

//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!

为我解决了此错误。

答案 11 :(得分:1)

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

为了使代码有效,请按以下步骤进行更改:

var project = {}加入var project1 = {}

答案 12 :(得分: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');

答案 13 :(得分:1)

在我的情况下,我忘记了在导出模块中包装所有代码的函数定义结束时的打开和关闭的parantheses。即我有:

(function () {
  'use strict';

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

而不是:

(function () {
  'use strict';

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

编译器没有抱怨,但导入模块中的require语句没有设置它所分配的变量,因此在你尝试构造它时它是未定义的,它将给出TypeError: MyClass is not a constructor错误。

答案 14 :(得分:0)

我的情况是我写错了。

exports.module = module_name

应该是..

module.exports = module_name

答案 15 :(得分:0)

要添加我在遇到此问题时发现的解决方案,我包括了另一个文件中的类,并且尝试实例化该文件的文件出现“不是构造函数”错误。最终,问题是在定义类之前,另一个文件中有几个未使用的需求。我不确定为什么他们会破坏它,但是删除它们会解决它。始终确保检查您正在考虑的步骤之间是否藏有东西。

答案 16 :(得分:-1)

Car.js

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

TestFile.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();