首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >创建对象时Javascript "Not a Constructor“异常

创建对象时Javascript "Not a Constructor“异常
EN

Stack Overflow用户
提问于 2012-04-11 21:44:51
回答 14查看 300.1K关注 0票数 125

我像这样定义了一个对象:

代码语言:javascript
复制
function Project(Attributes, ProjectWidth, ProjectHeight) {
    this.ProjectHeight = ProjectHeight;
    this.ProjectWidth = ProjectWidth;
    this.ProjectScale = this.GetProjectScale();
    this.Attributes = Attributes;

    this.currentLayout = '';

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

然后我尝试创建一个实例,如下所示:

代码语言:javascript
复制
var newProj = new Project(a,b,c);

但是抛出了这个异常:

代码语言:javascript
复制
Project is not a constructor

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

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2012-04-11 21:50:00

问题中发布的代码无法生成该错误,因为Project不是用户定义的函数/有效的构造函数。

代码语言:javascript
复制
function x(a,b,c){}
new x(1,2,3);               // produces no errors

你可能做过这样的事情:

代码语言:javascript
复制
function Project(a,b,c) {}
Project = {};               // or possibly   Project = new Project
new Project(1,2,3);         // -> TypeError: Project is not a constructor

使用var的变量声明是hoisted,因此总是在代码的其余部分之前进行计算。因此,这也可能导致问题:

代码语言:javascript
复制
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
}
票数 101
EN

Stack Overflow用户

发布于 2012-04-11 21:51:49

我也用谷歌搜索了一下,找到了这个解决方案:

你在某个地方有一个不是函数的变量Project。那么new操作员就会对此抱怨。在您应该将其用作构造器的地方尝试console.log(Project),您会找到它。

票数 26
EN

Stack Overflow用户

发布于 2016-10-19 01:43:53

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

代码语言:javascript
复制
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时会出现错误。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10107198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档