Javascript 在类中访问构造函数属性

Javascript 在类中访问构造函数属性,javascript,class,scope,ecmascript-6,this,Javascript,Class,Scope,Ecmascript 6,This,当涉及到对象变量时,我不理解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

当涉及到对象变量时,我不理解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
 — 我收到一个错误,说我试图调用
未定义的
上的
推送
。我做错了什么?

您没有在
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));
}

您没有在
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));
}

在事件监听器中,
通常是触发事件的对象在事件监听器中,
通常是触发事件的对象将匿名函数(您现在已更改为handler,但考虑到原始代码)更改为箭头函数也可以吗?因此,不需要绑定-考虑到代码已经使用了ES2015
,那么为什么不同时使用
=>
(如果是另一种选择)@JaromandaX-yes-“…在不同的范围内调用”可能比“使用不同的方法调用”更好因为调用函数的范围不影响函数的设置方式。;-)@RobG-你说得对,谢谢你。将匿名函数(现在已改为handler,但考虑到原始代码)更改为arrow函数也可以吗?因此,不需要绑定-考虑到代码已经使用了ES2015
,那么为什么不同时使用
=>
(如果是另一种选择)@JaromandaX-yes-“…在不同的范围内调用”可能比“使用不同的方法调用”更好因为调用函数的范围不影响函数的设置方式。;-)@罗布-你说得对,谢谢