В настоящее время я изучаю JS и ES6. У меня возникли проблемы с пониманием того, почему мой код с конструктором классов и функциями стрелок не работает без нескольких изменений.Объяснение эффекта конструктора классов ES6 и функций стрелок
Здесь я начал, модуль ES6 экспортировал этот поток-подобный объект диспетчера.
// RiotControl dispatcher formatted as ES6 module.
// https://github.com/jimsparkman/RiotControl
var dispatcher = {
stores: [],
addStore: function(store) {
this.stores.push(store);
}
};
['on','one','off','trigger'].forEach(function(api){
dispatcher[api] = function() {
var args = [].slice.call(arguments);
this.stores.forEach(function(el){
el[api].apply(null, args);
});
};
});
export default dispatcher
Я хотел сделать класс из этого кода и первоначально закончил с:
// RiotControl dispatcher formatted as ES6 class module.
// https://github.com/jimsparkman/RiotControl
export default class {
constructor() {
this.stores = []
this.addStore = store => {
this.stores.push(store);
}
['on','one','off','trigger'].forEach(fn => {
this[fn] =() => {
var args = [].slice.call(arguments)
this.stores.forEach(function(el){
el[fn].apply(null, args)
})
}
})
}
}
По неизвестным мне причинам, это не работает.
- Первые
.forEach(...)
результаты вUncaught TypeError: Cannot read property 'forEach' of undefined
, как если массив не определен. var args = [].slice.call(arguments)
приводит к тому, что args представляют собой массив с нулевой длиной, а не фактически, umm, имеющий аргументы.
Чтобы получить код работает, я изменил его к этому:
// RiotControl dispatcher formatted as ES6 class module.
// https://github.com/jimsparkman/RiotControl
export default class {
constructor() {
this.stores = []
this.addStore = store => {
this.stores.push(store);
}
var api = ['on','one','off','trigger']
api.forEach(fn => {
this[fn] = function() {
var args = [].slice.call(arguments)
this.stores.forEach(function(el){
el[fn].apply(null, args)
})
}
})
}
}
Таким образом, ошибки были зафиксированы
- объявления массива и вызова
.forEach
на что и - используя функцию обратного вызова вместо функции стрелки.
Пожалуйста, объясните, почему forEach
с встроенным массивом выходит из строя и почему из списка аргументов сбой из-за функции стрелки.
Также, вопрос о бонусе, почему this
в'this.stores.foreach 'привязан к экземпляру моего объекта, а не к примеру. событие, вызывающее вызов функции?
Вы по-прежнему получаете ошибки, если используете разделители ';'? У вас, похоже, есть аллергия на них –
Правильно, недостающая точка с запятой была причиной ошибки № 1. Я не страдаю аллергией, но несколько библиотек, на которые я смотрел, похоже, не содержат разделителей. Мне просто нужно изучить правила и принять конвенцию, чтобы использовать или не использовать их. Однако использование их кажется более безопасным. –