Во-первых, существует одноэлементный объект, на котором закреплено множество статических методов инструмента. Один из них — каждый, который используется для обхода массивов или объектов.
Скопируйте код кода следующим образом:
var ownForEach = [].forEach
var ownMap = [].map
варутил = {
каждый: функция (объект, итератор, контекст) {
если (obj == null) вернуть
if (nativeForEach && obj.forEach ===nativeForEach) {
obj.forEach(итератор, контекст)
} else if (obj.length === +obj.length) {
for (var я = 0; я <obj.length; я++) {
if (iterator.call(obj[i] || context, obj[i], i, obj) === true) return
}
} еще {
for (var k в obj) {
if (iterator.call(obj[k] || context, obj[k], k, obj) === true) return
}
}
},
карта: функция (объект, итератор, контекст) {
вар результаты = []
if (obj == null) вернуть результаты
if (nativeMap && obj.map === NativeMap) return obj.map(итератор, контекст)
this.each(obj, function(val, i, coll) {
результаты[i] = iterator.call(контекст, значение, я, кол)
})
вернуть результаты
}
}
Существуют также служебные функции, такие как Every, Some и т. д., которые работают с коллекциями (Array, Hash). При его использовании используйте метод util.xx.
Если определен класс коллекции, внутри этого класса есть данные коллекции.
Скопируйте код кода следующим образом:
функция Коллекция(данные) {
это.данные = данные ||
// некоторые другие свойства
// this.xxx = ггу
}
Коллекция.прототип = {
// какой-то метод
}
Вы можете легко скопировать методы util в класс коллекции, например
Скопируйте код кода следующим образом:
функция copyMethod(clazz, obj) {
for (метод var в obj) {
clazz.prototype[метод] = функция() {
var args = [].slice.call(аргументы)
вар цель = this.data
args.unshift(цель)
obj[метод].apply(obj, args)
}
}
}
copyMethod (Коллекция, утилита)
После копирования таким способом экземпляр Collection будет иметь метод util, а объект коллекции (первый параметр), управляемый util, — это this.data Collection. Вы можете напрямую просмотреть this.data следующим образом.
Скопируйте код кода следующим образом:
varcol = новая коллекция([10, 20, 30])
// обход
coll.each(function(k) {
консоль.log(к)
})
// работаем
вар arr = coll.map(function(k) {
возвращениек-5
})
console.log(arr) // 5, 15, 25
Этот шаблон используется во многих библиотеках с открытым исходным кодом, таких как jQuery, чей $.each/$.map удобно копируется в $().each/$().map.
Другой пример — Backbone, чьи _.each/_.map/_.every/_.chain (и многие другие) копируются в прототип Collection.
Скопируйте код кода следующим образом:
// Подчеркиваем методы, которые мы хотим реализовать в коллекции.
// 90% основных полезных функций Backbone Collections фактически реализовано
// прямо здесь:
var методы = ['forEach', 'each', 'map', 'collect', 'reduce', 'foldl',
«вставить», «редуцироватьправо», «папка», «найти», «обнаружить», «фильтровать», «выбрать»,
«отклонять», «каждый», «все», «некоторые», «любой», «включать», «содержит», «вызывать»,
«макс», «мин», «toArray», «размер», «первый», «голова», «взять», «начальный», «остальный»,
«хвост», «капля», «последний», «без», «разница», «индексOf», «перемешать»,
'lastIndexOf', 'isEmpty', 'цепочка'];
// Добавляем каждый метод Underscore в качестве прокси к `Collection#models`.
_.each(методы, функция(метод) {
Коллекция.прототип[метод] = функция() {
вар args = срез.call(аргументы);
args.unshift(this.models);
вернуть _[метод].apply(_, args);
};
});
Кроме того, в Backbone.Model копируются практические методы для операций с объектами, такие как _.keys/_.values/_.pairs/_.invert/_.pick (новое в версии 1.0)
Скопируйте код кода следующим образом:
var modelMethods = ['ключи', 'значения', 'пары', 'инвертировать', 'выбрать', 'опустить'];
// Добавляем каждый метод Underscore в качестве прокси к `Model#attributes`.
_.each(modelMethods, функция(метод) {
Модель.прототип[метод] = функция() {
вар args = срез.call(аргументы);
args.unshift(this.attributes);
вернуть _[метод].apply(_, args);
};
});