121 votes

Exception Javascript "Not a Constructor" 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 une instance comme ceci :

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

mais cette exception est levée :

Project is not a constructor

Qu'est-ce qui pourrait ne pas aller ? J'ai beaucoup cherché sur Internet, mais je n'arrive toujours pas à comprendre ce que je fais de mal.

1 votes

Par curiosité, quel navigateur donne ce message "Project is not a constructor" ?

18 votes

En tant que nœud latéral sans rapport, les directives générales de style JavaScript recommandent de commencer un identifiant de variable par une lettre majuscule uniquement s'il s'agit d'un constructeur : "Project" est correct, mais la majuscule de début dans "ProjectHeight" me suggère qu'il devrait également être un constructeur. Si vous utilisez "projectHeight" à la place, votre code sera plus lisible pour les autres. (En fait, si les autres posters ont raison, et que vous avez défini une variable Project ailleurs, l'utilisation de la règle de la majuscule initiale pour les constructeurs uniquement vous évitera de refaire cette erreur).

0 votes

@DaggNabbit Opera le fait (12.15)

4voto

S.Norrbjörk Points 141

Je veux juste ajouter que si le constructeur est appelé à partir d'un fichier différent, alors quelque chose d'aussi simple que d'oublier d'exporter le constructeur avec

module.exports = NAME_OF_CONSTRUCTOR

provoquera également l'exception "Not a constructor".

2voto

gmcc051 Points 140

Je viens d'avoir une erreur similaire en essayant d'utiliser le BS5ModalJS en conjonction avec webpack, ce qui signifie que j'essayais d'importer le fichier js.

Étant donné que l'unique fichier .js fourni a été conçu pour être utilisé via les balises script, il m'a fallu un certain temps pour réaliser que, pour éviter l'erreur "BSModal n'est pas un constructeur", je devais aller dans leur code et ajouter :

export {BSModal}

J'ai ensuite pu utiliser

import { BSModal } from './../thirdparty/BS5ModalJS/BS5Modal.js';

et faire

let myModal enter code here = nouveau BSModal(...)

sans obtenir cette erreur.

Si vous utilisez webpack, assurez-vous que les classes et les fonctions sont exportées (et donc disponibles) pour les appelants.

1voto

Gareth Points 66

Dans mon cas, j'avais oublié les paranthèses d'ouverture et de fermeture à la fin de la définition de la fonction enveloppant tout mon code dans le module exporté. C'est-à-dire que 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 assignée, de sorte qu'elle est indéfinie au moment où vous essayez de la construire et elle donnera le message TypeError: MyClass is not a constructor erreur.

1voto

Colin Points 363

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 puisque javascript interprète le constructeur prévu comme la variable nouvellement 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');

Il suffit de changer la casse ou le nom de la variable pour résoudre le problème :

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

1voto

Pravin Points 11

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, il faut le modifier comme suit :

var project = {} en var project1 = {}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X