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);
Но это исключение:
Project is not a constructor
Что может быть неправильным? Я много гулял, но до сих пор не могу понять, что я делаю неправильно.
Ответы
Ответ 1
Код, опубликованный в вопросе, не может генерировать эту ошибку, потому что 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
Объявления переменных, использующие var
, поднимаются и, таким образом, всегда оцениваются до остальной части кода. Таким образом, это также может вызвать проблемы:
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
}
Ответ 2
Дополнительной причиной этого могут быть функции стрелки ES2015. Они не могут быть использованы в качестве конструкторов.
const f = () => {};
new f(); // This throws "f is not a constructor"
Ответ 3
Я тоже нашел googled и нашел это решение:
У вас есть переменная Project
где-то, которая не является функцией. Тогда оператор new
будет жаловаться на это. Попробуйте console.log(Project)
в том месте, где вы использовали бы его как construcotr, и вы его найдете.
Ответ 4
Для меня это были различия между 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
Ответ 5
В моем случае я использовал имя прототипа в качестве имени объекта. Например,
function proto1()
{}
var proto1 = new proto1();
Это была глупая ошибка, но может помочь кому-то вроде меня;)
Ответ 6
Для моего проекта проблема оказалась круговой ссылкой, созданной вызовами 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.
Ответ 7
Чтобы добавить к ответу @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
Ответ 8
В моем случае я забыл открытые и закрытые скобки в конце определения функции, обертывающей весь мой код в экспортированном модуле. То есть У меня было:
(function () {
'use strict';
module.exports.MyClass = class{
...
);
Вместо:
(function () {
'use strict';
module.exports.MyClass = class{
...
)();
Компилятор не жалуется, но оператор require в модуле импорта не устанавливает переменную, которой она назначена, поэтому она undefined в точке, которую вы пытаетесь ее построить, и она даст TypeError: MyClass is not a constructor
ошибка.
Ответ 9
У меня была аналогичная ошибка, и моя проблема заключалась в том, что имя и регистр имени переменной и имени конструктора были идентичными, что не работает, поскольку 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');
Ответ 10
Это происходит потому, что вы использовали другую переменную с именем "project" в вашем коде. Что-то вроде
var project = {}
Чтобы заставить код работать, измените его следующим образом:
var project = {}
в var project1 = {}
Ответ 11
Я просто хочу добавить, что если конструктор вызывается из другого файла, то что-то столь же простое, как забыть экспортировать конструктор с
module.exports = NAME_OF_CONSTRUCTOR
также вызовет исключение "Не конструктор".
Ответ 12
Car.js
class Car {
getName() {return 'car'};
}
export default Car;
TestFile.js
const object = require('./Car.js');
const instance = new object();
error: TypeError: экземпляр не является конструктором
печать содержимого объекта
object = {default: Car}
добавьте по умолчанию функцию require и она будет работать как contructor
const object = require('object-fit-images').default;
const instance = new object();
instance.getName();