Exceção “Não é um construtor” de Javascript durante a criação de objects

Eu estou definindo um object como este:

function Project(Attributes, ProjectWidth, ProjectHeight) { this.ProjectHeight = ProjectHeight; this.ProjectWidth = ProjectWidth; this.ProjectScale = this.GetProjectScale(); this.Attributes = Attributes; this.currentLayout = ''; this.CreateLayoutArray = function() {....} } 

Eu então tento criar e instanciar assim:

 var newProj = new Project(a,b,c); 

Mas esta execption é lançada:

 Project is not a constructor 

O que pode estar errado? Eu pesquisei muito, mas ainda não consigo descobrir o que estou fazendo de errado.

O código como postado na pergunta não pode gerar esse erro, porque o Project não é uma function definida pelo usuário / construtor válido.

 function x(a,b,c){} new x(1,2,3); // produces no errors 

Você provavelmente já fez algo assim:

 function Project(a,b,c) {} Project = {}; // or possibly Project = new Project new Project(1,2,3); // -> TypeError: Project is not a constructor 

As declarações de variables ​​são sempre avaliadas antes do restante do código. Então, isso também pode estar causando problemas:

 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 } 

Uma causa adicional disso pode ser as funções de seta ES6. Eles não podem ser usados ​​como construtores.

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

Eu também pesquisei e encontrei esta solução:

Você tem um Project variável em algum lugar que não é uma function. Então o new operador vai reclamar sobre isso. Tente console.log(Project) no lugar onde você o teria usado como construcotr e você o encontrará.

Para mim, foram as diferenças entre import e require no ES6.

Por exemplo

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

No meu caso eu estava usando o nome do protótipo como o nome do object. Por exemplo

 function proto1() {} var proto1 = new proto1(); 

Foi um erro bobo, mas pode ser de ajuda para alguém como eu;)

Para meu projeto, o problema acabou sendo uma referência circular criada pelas chamadas 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; 

A razão é que quando está tentando inicializar y, ele cria um object temporário "y" (não class, object!) No sistema de dependência que, de alguma forma, ainda não é um construtor. Então, quando o x.js terminar de ser definido, ele poderá continuar fazendo seu construtor. Apenas, o x.js tem um erro no qual ele tenta usar o não-construtor y.

Para adicionar à resposta de @ wprl, a abreviatura do método de object ES6, como as funções de seta, também não pode ser usada como um construtor. 😅

 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 

No meu caso eu tinha esquecido os parantheses abertos e próximos no final da definição da function envolvendo todo o meu código no módulo exportado. Ou seja, eu tive:

 (function () { 'use strict'; module.exports.MyClass = class{ ... ); 

Ao invés de:

 (function () { 'use strict'; module.exports.MyClass = class{ ... )(); 

O compilador não reclama, mas a instrução require no módulo de importação não define a variável que está sendo atribuída, por isso é indefinida no ponto em que você tenta construí-la e fornecerá o TypeError: MyClass is not a constructor erro de TypeError: MyClass is not a constructor .

Eu tive um erro semelhante e meu problema era que o nome e o caso do nome da variável e do nome do construtor eram idênticos, o que não funciona, já que o javascript interpreta o construtor pretendido como a variável recém-criada.

Em outras palavras:

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

A simples alteração do nome da checkbox ou variável corrige o problema, embora:

 //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'); 

Isso está acontecendo porque você deve ter usado outra variável chamada “projeto” em seu código. Algo como var project = {}

Para você fazer o código funcionar, altere da seguinte maneira:

var project = {} em var project1 = {}

Car.js

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

TestFile.js

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

error: TypeError: instance não é um construtor

imprimir conteúdo de object

 object = {default: Car} 

anexe o padrão à function require e funcionará como contructor

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