Ключ к вашему любопытству лежит в исходном коде с подчеркиванием. Как вы, вероятно, уже знаете, большое количество методов, доступных вам в Backbone.Collection, передаются из символа подчеркивания.
Давайте сначала посмотрим, как они это делают:
// Underscore methods that we want to implement on the Collection.
// 90% of the core usefulness of Backbone Collections is actually implemented
// right here:
var methods = ['forEach', 'each', 'map', 'collect', 'reduce', 'foldl',
'inject', 'reduceRight', 'foldr', 'find', 'detect', 'filter', 'select',
'reject', 'every', 'all', 'some', 'any', 'include', 'contains', 'invoke',
'max', 'min', 'toArray', 'size', 'first', 'head', 'take', 'initial', 'rest',
'tail', 'drop', 'last', 'without', 'difference', 'indexOf', 'shuffle',
'lastIndexOf', 'isEmpty', 'chain'];
// Mix in each Underscore method as a proxy to `Collection#models`.
_.each(methods, function(method) {
Collection.prototype[method] = function() {
// Important: BOLT ON THE COLLECTION MODELS TO THE ARGUMENTS.
var args = slice.call(arguments);
args.unshift(this.models);
// .apply (since we have an array of arguments).
return _[method].apply(_, args);
};
});
Итак, у нас есть список имен методов подчеркивания. Исходный код перебирает эти имена методов и добавляет каждое из них в прототип вашей коллекции. Важно: вы заметите, что этот код исправляет список аргументов для включения в модели вашей коллекции.
Теперь посмотрим на фактическую реализацию метода подчеркивания:
_.filter = _.select = function(obj, iterator, context) {
var results = [];
if (obj == null) return results;
if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);
each(obj, function(value, index, list) {
if (iterator.call(context, value, index, list)) results.push(value);
});
return results;
}
Вы заметите, что фильтр просто обходит каждый и циклически проходит через переданный объект (свойства). Все, что делает базовая версия, — это помещает этот метод в контекст, чтобы избавить вас от необходимости каждый раз передавать модели.
person
backdesk
schedule
12.12.2013