Javascript: Uncaught TypeError, а не конструктор

Я просмотрел все сообщения здесь, связанные с этой темой, но не смог найти рабочего решения. Может быть что-то совсем другое в моем коде.

Файл 1, RequestFactory.js

function requestFactory() {
    this.createRequest = function (reportId) {
      var request;
      request = new xyzRequestManager.XyzRequest();
      return request;
    } 
    return {
      RequestFactory: requestFactory
    } 
 }

Файл 2, request.js

function loadData() {
  var request = requestFactory.createRequest(id);
  request.loadReport(report);
}

Файл 3, xyzRequestManager.js

function () {
 var xyzRequest = function() {
   this.loadReport = function(report) { --some data--}
 }
 return {
   XyzRequest: xyzRequest
 }
}

Итак, вызов начинается с файла2, я создаю объект запроса, вызывая requestFactory. В файле 3 записано множество других функций, которые аналогичным образом вызываются из файла 1, запрашивают фабричный объект и вызывают функцию.

Это дает ошибку как,

Uncaught TypeError: xyzRequestManager.XyzRequest is not a constructor

Я потратил часы на это, и до сих пор не знаю, что и где я не прав. Любая помощь будет оценена по достоинству.


person Anshul    schedule 14.08.2016    source источник
comment
Ваша функция requestFactory добавляет метод createRequest к глобальному объекту, а не к функции requestFactory. requestFactory.createRequest это undefined. Этот код имеет много проблем. JavaScript чувствителен к регистру!   -  person undefined    schedule 14.08.2016
comment
Это может показаться не вашим реальным кодом, не в последнюю очередь потому, что показанный xyzRequestManager.js завершится ошибкой синтаксиса, а показанный код выдаст отличную ошибку от той, что в вопросе (см. Комментарий Vohuman). Создайте фактический минимальный воспроизводимый пример и покажите, как вы загружаете файлы, чтобы они могли ссылаться на содержимое друг друга. .   -  person T.J. Crowder    schedule 14.08.2016
comment
Имя переменной и имя функции не могут совпадать   -  person 陈俊高    schedule 27.04.2017


Ответы (1)


Вы возвращаете объект со свойством XyzRequest, а не xyzRequest, см. комментарий ***:

// Note: This is verbatim from the question other than this comment and
// the *** comment below.. It's not valid syntax on its own (the function
// would need a name), but I assume it's an excerpt from something larger.
function () {
 var xyzRequest = function() {
   this.loadReport = function(report) { --some data--}
 }
 return {
   XyzRequest: xyzRequest     // ***
 }
}

Итак, чтобы использовать его, вам понадобится заглавная буква X:

request = new xyzRequestManager.XyzRequest();
// -----------------------------^
person Community    schedule 14.08.2016
comment
обновил, а проблема та же. Я пробовал с тем же именем, другим именем, даже с другим корпусом !! Но все та же ошибка. - person Anshul; 14.08.2016