2017-01-03 3 views
1

Я пытаюсь применить некоторые шаблоны проектирования OO к существующему скрипту, а после выполнения некоторых руководств в справочном центре Mozilla я все еще получаю сообщение об ошибке при попытке создать экземпляр объекта.Объект не является конструктором Ошибка JavaScript

Я просмотрел эти ресурсы для получения помощи, но, возможно, я не полностью понимаю синтаксис JavaScript.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript

Ошибка:

Uncaught TypeError: GeoLocMap is not a constructor 

Строка ошибки:

var GeoLocMap = new GeoLocMap(); 

Если каждый из методов ниже быть определена в качестве прототипа?

Спасибо за помощь!

Код:

function GeoLocMap() { 

     this.map = -1; 
     this.regionName = ""; 
     this.options = -1; 
     this.openCountData = -1; 
     this.chart = -1; 

     this.getMap = function() { 
      if (this.map == -1) { 
       this.map = new google.maps.Map(document.getElementById('geochart-colors'), { 
        zoom: 6, 
        //TODO replace with the region retrieved from eventData 
        center: new google.maps.LatLng(lat, long), 
        mapTypeId: google.maps.MapTypeId.ROADMAP 
       }); 
      } else { 
       return this.map; 
      } 
     }; 

     this.getMapWidth = function() { 
      var docBody = document.body; 
      var docElem = document.documentElement; 

      if (typeof document.width !== 'undefined') { 
       return document.width;// For webkit browsers 
      } else { 
       return Math.max(docBody.scrollWidth, docBody.offsetWidth, docElem.clientWidth, docElem.scrollWidth, docElem.offsetWidth); 
      } 
     }; 

     this.getMapHeight = function() { 
      var docBody = document.body; 
      var docElem = document.documentElement; 

      if (typeof document.height !== 'undefined') { 
       return document.height;// For webkit browsers 
      } else { 
       return Math.max(docBody.scrollHeight, docBody.offsetHeight, docElem.clientHeight, docElem.scrollHeight, docElem.offsetHeight); 
      } 

     }; 

     this.getChart = function() { 

      if (this.chart == -1){ 
       this.chart = new google.visualization.GeoChart(document.getElementById('geochart-colors')); 
      } 

      return this.chart; 

     }; 

     this.getOpenCountData = function() { 

      if (this.openCountData == -1) { 
       var data = new google.visualization.DataTable(); 
       data.addColumn('string', 'Country'); 
       data.addColumn('number', 'Open Count'); 

       this.openCountData = data; 

      } 

      return this.openCountData; 
     }; 

     this.addOpenCountDataRow = function(dataRow) { 

      if (this.openCountData == -1){ 
       this.getOpenCountData(); 
      } 

      if (dataRow == -1){ 
       return -1; 
      } 

      this.openCountData.addRows(dataRow); 

      return 1; 

     }; 

     this.getOptions = function() { 

      if (this.options == -1) { 
       this.options = { 
        width: width, 
        height: height, 
        region: 'US', 
        resolution: 'provinces', 
        colors: ['#FFFFFF', '#FFFFFF'] 
       }; 
      } 

      return this.options; 
     }; 

     this.setOptions = function (property, value) { 

      if (this.options == -1) { 
       this.getOptions(); 
      } 

      if (value === undefined) { 
       return -1; 
      } 

      this.options[property] = value; 

      return 1; 

     }; 

     this.drawMap = function() { 

      if (this.chart == -1){ 
       this.getChart(); 
      } 

      if (this.options == -1){ 
       this.getOptions(); 
      } 

      if (this.openCountData == -1){ 
       this.getOpenCountData(); 
      } 

      this.chart.draw(this.openCountData, this.options); 
     }; 

    } 
+1

'вар GeoLocMap = новый GeoLocMap();'? И то же имя? –

+0

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

ответ

6

Когда вы

var GeoLocMap = new GeoLocMap(); 

вы действительно

var GeoLocMap = undefined; // hoisted to the top of the scope 
// other code in the same scope 
GeoLocMap = new GeoLocMap(); 

, следовательно, ваша ошибка.

Просто используйте другое имя, например

var geoLocMap = new GeoLocMap(); 

Больше информации в the MDN on variable scope and hoisting

+0

Прекрасно работает, спасибо большое! – Colby

-1

Вы должны быть осведомлены о JavaScript Hoisting, что только что описал @Denys Séguret является то, что происходит.

Вы должны назначить новый экземпляр в другой переменной

var GeoLocMapInstance = new GeoLocMap(); 
+2

Нужно ли отвечать, говоря, что мое правильно? –

+1

Ваш ответ не дает контекста, почему это происходит, я просто добавляю определение Подъемника, вы можете легко обновить свое, и я удалю мой :), так как понимание того, почему все происходит, более важно, просто скажите, скопируйте/вставьте код. –

+0

lol downvotes, тот факт, что вы также не указали решение, делает ваш ответ неправильным, не нужно понижать голос мой ответ –

Смежные вопросы