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

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

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

会出什么问题呢? 我谷歌了很多,但我仍然不知道我做错了什么。

348523 次浏览

问题中提到的代码不能生成该错误,因为 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
}

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

你有一个不是函数的变量 Project。然后 new操作员会对此进行投诉。在您将使用 console.log(Project)作为构造函数的地方尝试 console.log(Project),您将找到它。

另一个原因可能是 ES2015箭头函数.它们不能用作构造函数

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

在我的例子中,我使用原型名称作为对象名称。

function proto1()
{}


var proto1 = new proto1();

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

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

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”对象(不是 class,而是 object!)在依赖系统中,它还不是构造函数。然后,当 x.js 完成定义时,它可以继续使 y 成为一个构造函数。只是,x.js 在尝试使用非构造函数 y 时出现了错误。

对我来说,这就是 ES6上 importrequire的区别。

例如。

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() // succeed

在我的例子中,我忘记了函数定义的末尾打开和关闭的括号,该函数将我的所有代码包装在导出的模块中。也就是说:

(function () {
'use strict';


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

而不是:

(function () {
'use strict';


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

编译器没有抱怨,但是导入模块中的 request 语句没有设置赋给它的变量,所以在您尝试构造它的时候它是未定义的,并且它会给出 TypeError: MyClass is not a constructor错误。

要添加到@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

我有一个类似的错误,我的问题是,变量名和构造函数名的名称和大小写是相同的,这不起作用,因为 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');

之所以会发生这种情况,是因为您在代码中使用了另一个名为“ project”的变量 var project = {}

要使代码正常工作,请更改如下:

var project = {}var project1 = {}

Car.js

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

TestFile.js

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

Instance 不是构造函数

对象的打印内容

object = {default: Car}

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

const object = require('object-fit-images').default;
const instance = new object();
instance.getName();

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

module.exports = NAME_OF_CONSTRUCTOR

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

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

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

帮我解决了这个问题。

有时只是你如何导出和导入它。对于此错误消息,可能是缺少 违约关键字。

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

为了将我发现的解决方案添加到这个问题中,我从另一个文件中包含了一个类,并且我试图在其中实例化它的文件给出了“ not a structor”错误。最终的问题是,在定义类之前,另一个文件中有两个未使用的需求。我不知道他们为什么把它弄坏了,但是把它移走就修好了。一定要确保检查是否有什么东西可能隐藏在你正在思考的步骤之间。

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

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

export {BSModal}

我就能够使用

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

也确实如此

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

而不会得到那个错误。

因此,如果您正在使用 webpack,可能需要确保将类和函数导出(因此可用)到调用方。

在浏览(假设您的应用程序正在运行) ,检查,源代码,并确保构造函数的 javascript 文件已加载。

对我来说,这是因为一个小小的打字错误。

我有一个类导出像->

module.export = class TestClass {
constructor() {}
}

我试图用这个类作为->

const testClass = new TestClass();

问题和输入错误出现在 module.export,它应该是 module.export,所以

module.exports = class TestClass { // module.exports here instead of export
constructor() {}
}

在我的例子中,这是由于两个类之间的循环引用造成的。我在类 A 文件中导入了类 B,在类 B 文件中导入了类 A,所以程序从未达到实际将 A 定义为类的程度。