Исключение 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 ответов:
код, опубликованный в вопросе, не может генерировать эту ошибку, потому что
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();