Javascript“不是构造函数”exception,同时创build对象
我正在定义一个像这样的对象:
function Project(Attributes, ProjectWidth, ProjectHeight) { this.ProjectHeight = ProjectHeight; this.ProjectWidth = ProjectWidth; this.ProjectScale = this.GetProjectScale(); this.Attributes = Attributes; this.currentLayout = ''; this.CreateLayoutArray = function() {....} }
然后我尝试创build和实例如下所示:
var newProj = new Project(a,b,c);
但是这个执行被抛出:
Project is not a constructor
什么可能是错的? 我search了很多,但仍然无法弄清楚我做错了什么。
问题中发布的代码无法生成该错误,因为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
variables声明总是在代码的其余部分之前被评估。 所以,这也可能导致问题:
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 }
另外一个原因可能是ES6箭头function。 它们不能用作构造函数。
const f = () => {}; new f(); // This throws "f is not a constructor"
我也search了一下,发现这个解决scheme:
你有一个不是一个函数的variablesProject
。 那么new
运营商会抱怨。 尝试console.log(Project)
的地方,你会用它作为一个build设者,你会发现它。
对我来说,这是ES6上的import
和require
之间的差异。
例如
// 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
在我的情况下,我使用原型名称作为对象名称。 例如
function proto1() {} var proto1 = new proto1();
这是一个愚蠢的错误,但可能会帮助像我这样的人;)
对于我的项目来说,问题原来是由require()调用创build的循环引用:
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时,它会在依赖系统中创build一个暂时的“y”对象(不是类,对象!),这个对象在某种程度上还不是构造函数。 然后,当x.js完成定义时,它可以继续制作ya的构造函数。 只有,x.js在它尝试使用非构造函数y的地方有一个错误。
在我的情况下,我忘记了在导出模块中封装所有代码的函数定义的末尾处的开放和封闭的渐变。 即我有:
(function () { 'use strict'; module.exports.MyClass = class{ ... );
代替:
(function () { 'use strict'; module.exports.MyClass = class{ ... )();
编译器不会抱怨,但是导入模块中的require语句不会设置它被分配给的variables,所以在你尝试构造它的时候它是未定义的,它会给出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
我有一个类似的错误,我的问题是variables名称和构造函数名称的名称和情况是相同的,这是行不通的,因为JavaScript解释为新创build的variables所需的构造函数。
换一种说法:
function project(name){ this.name = name; } //elsewhere... //this is no good! name/case are identical so javascript barfs. let project = new project('My Project');
但是,只是更改案例或variables名称可以解决问题:
//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');