Je définis un objet comme ceci:
function Project(Attributes, ProjectWidth, ProjectHeight)
{
this.ProjectHeight = ProjectHeight;
this.ProjectWidth = ProjectWidth;
this.ProjectScale = this.GetProjectScale();
this.Attributes = Attributes;
this.currentLayout = '';
this.CreateLayoutArray = function()
{....}
}
J'essaie ensuite de créer et d'instance comme ceci:
var newProj = new Project(a,b,c);
Mais cette exception est lancée:
Project is not a constructor
Quel pourrait être le problème? J'ai beaucoup cherché sur Google, mais je n'arrive toujours pas à comprendre ce que je fais de travers.
Le code affiché dans la question ne peut pas générer cette erreur, car Project
n'est pas une fonction définie par l'utilisateur ni un constructeur valide.
function x(a,b,c){}
new x(1,2,3); // produces no errors
Vous avez probablement fait quelque chose comme ça:
function Project(a,b,c) {}
Project = {}; // or possibly Project = new Project
new Project(1,2,3); // -> TypeError: Project is not a constructor
Les déclarations de variables utilisant var
sont levées et sont donc toujours évaluées avant le reste du code. Donc, cela peut aussi causer des problèmes:
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
}
Une cause supplémentaire de ceci peut être ES2015 fonctions de flèche . Ils ne peuvent pas être utilisés en tant que constructeurs .
const f = () => {};
new f(); // This throws "f is not a constructor"
Pour moi, c’est la différence entre import
et require
sur ES6.
Par exemple.
// 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
J'ai aussi cherché sur Google et trouvé cette solution:
Vous avez une variable Project
quelque part qui n'est pas une fonction. Ensuite, l'opérateur new
s'en plaindra. Essayez console.log(Project)
à l'endroit où vous l'auriez utilisé comme construction et vous le trouverez.
Pour mon projet, le problème s'est avéré être une référence circulaire créée par les appels 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;
La raison en est que, lorsqu’il tente d’initialiser y, il crée un objet "y" temporaire (pas une classe, un objet!) Dans le système de dépendances qui n’est en quelque sorte pas encore un constructeur. Ensuite, lorsque x.js est terminé, il peut continuer à faire de y un constructeur. Seulement, x.js a une erreur dans lequel il essaie d'utiliser le non-constructeur y.
Dans mon cas, j'utilisais le nom du prototype comme nom d'objet. Par exemple.
function proto1()
{}
var proto1 = new proto1();
C'était une erreur stupide mais pourrait être utile à quelqu'un comme moi;)
Je veux juste ajouter que si le constructeur est appelé à partir d'un autre fichier, il vous suffit de quelque chose d'aussi simple que d'oublier d'exporter le constructeur avec
module.exports = NAME_OF_CONSTRUCTOR
provoquera également l’exception "Pas un constructeur".
Pour ajouter à la réponse de @ wprl, la méthode abrégée de la méthode d'objet ES6, comme les fonctions de flèche, ne peut pas non plus être utilisée comme constructeur. ????
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
Dans mon cas, j'avais oublié les parenthèses d'ouverture et de fermeture à la fin de la définition de la fonction englobant tout mon code dans le module exporté. C'est à dire. J'avais:
(function () {
'use strict';
module.exports.MyClass = class{
...
);
Au lieu de:
(function () {
'use strict';
module.exports.MyClass = class{
...
)();
Le compilateur ne se plaint pas, mais l'instruction require dans le module d'importation ne définit pas la variable à laquelle elle est affectée. Elle n'est donc pas définie au moment où vous essayez de la construire et donne l'erreur TypeError: MyClass is not a constructor
.
Cela se produit parce que vous devez avoir utilisé une autre variable nommée "projet" dans votre code. Quelque chose comme var project = {}
Pour que le code fonctionne, changez comme suit:
var project = {}
dans var project1 = {}
J'ai eu une erreur similaire et mon problème était que le nom et la casse du nom de la variable et du nom du constructeur étaient identiques, ce qui ne fonctionne pas car javascript interprète le constructeur prévu comme étant la nouvelle variable créée.
En d'autres termes:
function project(name){
this.name = name;
}
//elsewhere...
//this is no good! name/case are identical so javascript barfs.
let project = new project('My Project');
Le simple changement de casse ou de nom de variable résout le problème, cependant:
//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');