Вопрос:

Проблемы с переменной объекта javascript и областью видимости метода с помощью navigator.geolocation.watchPosition

javascript object methods w3c-geolocation

34 просмотра

1 ответ

488 Репутация автора

Я пытаюсь перейти от моего старого процедурного подхода к кодированию javascript к более объектному подходу. Одним из фрагментов кода, который я пытаюсь перенести, является мой трекер местоположения, как показано здесь:

var gps = new geolocation();

function geolocation() {
  this.watchID;
  this.position;

  this.success = function(p) {
    this.position = p;
  };

  this.failure = function(error) {
    var errmsg;

    // convert the error code to a readable message
    switch(error.code)
    {
        case error.PERMISSION_DENIED:
          errmsg="App doesn't have permission to access your location.";
          break;
        case error.POSITION_UNAVAILABLE:
          errmsg="Your location information is unavailable to App.";
          break;    
        case error.TIMEOUT:
          errmsg="App's request to get your location timed out.";        
          break;
        case error.UNKNOWN_ERROR:
          errmsg="An unknown GPS error occurred.";
          break;
    }
    console.log(errmsg);
  };

  this.watchPosition = function() {
    if(!this.watchID)
    {
      this.watchID = navigator.geolocation.watchPosition(this.success, this.failure, { maximumAge: 1000, timeout: 15000, enableHighAccuracy: true });
    }
  };

  this.getPosition = function() {
    return(this.position);
  };

  this.clearWatch = function() {
    if(this.watchID)
    {
      // turn off the watch
      navigator.geolocation.clearWatch(this.watchID);
      this.watchID = null;
      console.log("GPS WatchID was cleared.", "GPS Status");
    }
  };
};

Я могу получить доступ ко всем методам в этом объекте. Когда я запускаю gps.watchPosition (); this.watchID устанавливается. Тем не менее, когда я использую:

var p = gps.getPosition(); 

Я получаю p как 'undefined', и прогон отладчика показывает, что this.position также не определено.

Если я возвращаю этот код в процедурное состояние, он работает нормально. Очевидно, я что-то упускаю, но я просто не могу понять, что.

(примечание: я сделал минимизацию этого кода перед публикацией)

Автор: ppetree Источник Размещён: 08.11.2017 11:17

Ответы (1)


0 плюса

488 Репутация автора

ответ лежит в «этом» - поскольку, очевидно, идти в ногу с «этим» слишком сложно для инженеров javascript, поэтому внутри вашего объекта вы должны сделать копию «этого», а затем использовать копию для ссылки на элементы в вашем объект.

function geolocation() {
  var self = this;
  this.watchID;
  this.position;

  this.success = function(p) {
    self.position = p;
  };
Автор: ppetree Размещён: 17.11.2017 08:56
Вопросы из категории :
32x32