2017-01-09 6 views
0

Я не понимаю область JavaScript, когда речь заходит об объектных переменных. У меня есть следующий класс:Доступ к свойствам конструктора в классе

class DataHandler { 
    constructor(boardIDA, boardIDB, accessToken, eventA, eventB) { 
    this.times = []; 
    this.eventA = eventA; 
    this.eventB = eventB; 
    this.apiURLA = "https://api.particle.io/v1/devices/" + boardIDA + "/events/" + eventA + "/?access_token=" + 
     accessToken; 
    this.apiURLB = "https://api.particle.io/v1/devices/" + boardIDB + "/events/" + eventB + "/?access_token=" + accessToken; 
    this.eventListenerA = new EventSource(this.apiURLA); 
    this.eventListenerB = new EventSource(this.apiURLB); 
    this.addListener(this.eventListenerA, 
     eventA); 
    this.addListener(this.eventListenerB, eventB); 
    } 
    addListener(eventSrc, eventName) { 
    eventSrc.addEventListener(eventName, function(info) { 
     alert(eventName); 
     var parsedData = JSON.parse(info.data); 
     this.times.push(parsedData); 
    }); 
    } 
} 

Вопрос относится к this.times. Я объявил это в конструкторе. Тем не менее, я не могу получить доступ к нему в addListener. Я получаю сообщение об ошибке, что я пытаюсь позвонить push по телефону undefined. Что я делаю не так?

+0

в слушателя событий, 'this', как правило, объект, который вызвал событие –

ответ

2

Вы не обращаетесь к нему в addListener, вы пытаетесь получить к нему доступ в анонимном обработчике событий, который вызывается с другим this.

addListener(eventSrc, eventName) { 
    var handler = function(info) { 
    alert(eventName); 
    var parsedData = JSON.parse(info.data); 
    this.times.push(parsedData); 
    }; 
    eventSrc.addEventListener(eventName, handler.bind(this)); 
} 
+0

бы меняющееся анонимную функцию (которая теперь вы изменились обработчик, но мышление исходного кода) к функции стрелки также работать ? поэтому отрицание необходимости связывания - учитывая, что код уже использует ES2015 'class', тогда почему бы не использовать' => 'также (если это альтернатива) –

+0

@JaromandaX - yes - https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions # No_binding_of_this – Igor

+0

"* ... вызываемый в другой области *" может быть лучше, чем "вызывается с другим * этим *", поскольку область, из которой вызывается функция, не влияет как его * это * установлено. ;-) – RobG

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

  • Нет связанных вопросов^_^