Исключение Javascript "не конструктор" при создании объектов


Я определяю такой объект:

function Project(Attributes, ProjectWidth, ProjectHeight)
{
    this.ProjectHeight = ProjectHeight;
    this.ProjectWidth = ProjectWidth;
    this.ProjectScale = this.GetProjectScale();
    this.Attributes = Attributes;

    this.currentLayout = '';

    this.CreateLayoutArray = function()
    {....}
}

затем я пытаюсь создать и экземпляр, как это:

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

но это execption бросается:

Project is not a constructor

что может быть не так? Я погуглил вокруг много, но до сих пор не могу понять, что я делаю неправильно.

11 62

11 ответов:

код, опубликованный в вопросе, не может генерировать эту ошибку, потому что Project не является определяемой пользователем функцией / допустимым конструктором.

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

вы, наверное, сделали что-то вроде этого:

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

объявления переменных всегда вычисляются перед остальной частью кода. Таким образом, это также может быть причиной проблем:

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
}

дополнительной причиной этого могут быть функции стрелки ES6. Они не могут быть использованы в качестве конструкторов.

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

Я тоже погуглил и нашел это решение:

переменная Project где-то это не функция. Тогда new оператор будет жаловаться на это. Попробуй console.log(Project) в том месте, где вы бы использовали его в качестве конструктора, и вы его найдете.

для меня это были различия между import и require на ES6.

например.

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

в моем случае я использовал имя прототипа в качестве имени объекта. Например,

function proto1()
{}

var proto1 = new proto1();

Это была глупая ошибка, но может быть поможет кому-то вроде меня ;)

для моего проекта проблема оказалась круговой ссылкой, созданной вызовами 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;

причина в том, что когда он пытается инициализировать y, он создает временный объект "y" (не класс, объект!) в системе зависимостей, которая как-то еще не является конструктором. Затем, когда x.js будет определен, он может продолжать делать y конструктором. Только, x. js имеет ошибку в нем, где он пытается использовать не-конструктор y.

чтобы добавить к ответу @wprl, сокращенный метод объекта ES6, как и функции стрелки, также не может использоваться в качестве конструктора.

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

в моем случае я забыл открытые и закрытые парантезы в конце определения функции, обертывающей весь мой код в экспортированном модуле. То есть у меня было:

(function () {
  'use strict';

  module.exports.MyClass = class{
  ...
);

вместо:

(function () {
  'use strict';

  module.exports.MyClass = class{
  ...
)();

компилятор не жалуется, но оператор require в модуле импорта не устанавливает переменную, которой он назначается, поэтому она не определена в точке, которую вы пытаетесь построить, и она даст TypeError: MyClass is not a constructor ошибка.

у меня была аналогичная ошибка, и моя проблема заключалась в том, что имя и регистр имени переменной и имени конструктора были идентичны, что не работает, поскольку javascript интерпретирует предполагаемый конструктор как вновь созданную переменную.

другими словами:

function project(name){
    this.name = name;
}

//elsewhere...

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

простое изменение регистра или имени переменной устраняет проблему, хотя:

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

это происходит потому, что вы должны были использовать другую переменную с именем "проект" в коде. Что-то вроде var project = {}

чтобы код работал, измените его следующим образом:

var project = {} на var project1 = {}

автомобиля.js

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

вопросами и ответами.js

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

ошибка: TypeError: экземпляр не является конструктором

печать содержимого объекта

object = {default: Car}

добавьте значение по умолчанию к функции require, и она будет работать как contructor

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