web-dev-qa-db-fra.com

Javascript "Pas un constructeur" Exception lors de la création d'objets

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.

82
unni

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
}
77
Rob W

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"
41
wprl

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
24
Richard Nienaber

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.

20
Bergi

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.

11
Edwin Hoogerbeets

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

10
Jiten

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".

4
S.Norrbjörk

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
2
Glenn Mohammad

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.

1
Gareth

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 = {}

1
Pravin

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');
1
Colin