Javascript “Not a Constructor” Eccezione durante la creazione di oggetti

Sto definendo un object come questo:

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

Quindi provo a creare e istanza come questa:

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

Ma questa esecuzione è lanciata:

 Project is not a constructor 

Cosa potrebbe esserci di sbagliato? Ho cercato spesso su google, ma non riesco ancora a capire cosa sto facendo male.

    Il codice pubblicato nella domanda non può generare quell’errore, perché Project non è una funzione definita dall’utente / costruttore valido.

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

    Probabilmente hai fatto qualcosa del genere:

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

    Le dichiarazioni delle variabili vengono sempre valutate prima del resto del codice. Quindi, questo può anche causare problemi:

     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 } 

    Una causa aggiuntiva di questo può essere le funzioni freccia ES6. Non possono essere usati come costruttori.

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

    Ho cercato anche su google e ho trovato questa soluzione:

    Hai un Project variabile da qualche parte che non è una funzione. Allora il new operatore si lamenterà di ciò. Prova console.log(Project) nel punto in cui lo avresti usato come costrutto, e lo troverai.

    Per me sono state le differenze tra import e require su ES6.

    Per esempio

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

    Nel mio caso stavo usando il nome del prototipo come nome dell’object. Per es

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

    È stato uno stupido errore ma potrebbe essere d’aiuto a qualcuno come me;)

    Per il mio progetto, il problema si è rivelato essere un riferimento circolare creato dalle chiamate 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; 

    Il motivo è che quando tenta di inizializzare y, crea un object "y" temporaneo (non class, object!) Nel sistema di dipendenze che in qualche modo non è ancora un costruttore. Quindi, quando x.js ha finito di essere definito, può continuare a fare il costruttore. Solo, x.js ha un errore in esso nel tentativo di usare il non costruttore y.

    Per aggiungere alla risposta di @ wprl, la scorciatoia del metodo dell’object ES6, come le funzioni freccia, non può essere utilizzata neanche come costruttore. 😅

     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 

    Nel mio caso ho dimenticato le parate aperte e chiuse alla fine della definizione della funzione che avvolge tutto il mio codice nel modulo esportato. Cioè ho avuto:

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

    Invece di:

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

    Il compilatore non si lamenta, ma l’istruzione require nel modulo di importazione non imposta la variabile a cui è assegnata, quindi è indefinito nel punto in cui si tenta di costruirlo e darà l’errore TypeError: MyClass is not a constructor errore TypeError: MyClass is not a constructor .

    Ho avuto un errore simile e il mio problema era che il nome e il caso del nome della variabile e il nome del costruttore erano identici, il che non funziona poiché javascript interpreta il costruttore previsto come variabile appena creata.

    In altre parole:

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

    Cambiando semplicemente caso o nome variabile si risolve il problema, tuttavia:

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

    Sta succedendo perché devi aver usato un’altra variabile chiamata “progetto” nel tuo codice. Qualcosa come var project = {}

    Per far sì che il codice funzioni, cambia come segue:

    var project = {} in 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 non è un costruttore

    stampare il contenuto dell’object

     object = {default: Car} 

    aggiungi predefinito alla funzione require e funzionerà come contructor

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