Здравствуйте! Разбираюсь немного с объектами и this, и никак не могу понять как решить следующую проблему:
1. У нас есть некий массив с объектами под названием 'beers'
var beers = [ {}, {}, ... другие объекты массива ];
2. Добавляем методы к beers:
beers.reduceBeers = function () {
this.reduce(function (all, item, index) {
if (item.locale === 'domestic') {
all.push(item);
}
return all;
}, []);
return this;
};
beers.logBeers = function () {
console.log(this);
return this;
};
beers.otherBeers = function () {
console.log('some other method that doing something with beers');
return this;
};
3. В итоге нам нужно, чтобы могли делать цепные вызовы этих методов
beers.reduceBeers().logBeers().otherBeers();
Для того, чтобы делать цепные вызовы мы должны возвращать 'this' после каждого выполнения метода. Но в методе beers.reduceBeers мы не изменяем сам массив beers (так как reduce возвращает новый ) и this просто возвращает beers без изменений. И следующий метод будет применятся к изначальному массиву beers, а не к отсортированному, с применением reduce. То есть нужно что-то вроде "this = this.reduce(function ... " но так делать нельзя, выдает ошибку. А если возвращать что-то другое, а не this, то следующий метод в цепочке (logBeers в нашем случае) просто не будет работать.
Буду очень благодарен если кто-то подскажет как это можно решить, единственное что пришло в голову это добавлять методы в Array.prototype но это как я читал очень нежелательно делать, особенно в таком случае как у меня...