Javascript 在类中访问构造函数属性
当涉及到对象变量时,我不理解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
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-“…在不同的范围内调用”可能比“使用不同的方法调用”更好因为调用函数的范围不影响函数的设置方式。;-)@罗布-你说得对,谢谢