Primero, hay un objeto singleton con muchos métodos de herramientas estáticas adjuntos. Uno de ellos es cada uno, que se utiliza para atravesar matrices u objetos.
Copie el código de código de la siguiente manera:
var nativoParaCada = [].paraCada
var mapa nativo = [].mapa
varutil = {
cada uno: función (obj, iterador, contexto) {
si (obj == nulo) regresa
if (nativoParaCada && obj.forCada === nativoParaCada) {
obj.forEach(iterador, contexto)
} más si (obj.length === +obj.length) {
for (var i = 0; i < longitud obj.; i++) {
if (iterator.call(obj[i] || contexto, obj[i], i, obj) === verdadero) retorno
}
} demás {
para (var k en obj) {
if (iterator.call(obj[k] || contexto, obj[k], k, obj) === verdadero) retorno
}
}
},
mapa: función (obj, iterador, contexto) {
var resultados = []
si (obj == null) devuelve resultados
if (nativeMap && obj.map === NativeMap) devuelve obj.map(iterador, contexto)
this.each(obj, función(val, i, coll) {
resultados[i] = iterador.call(contexto, val, i, coll)
})
devolver resultados
}
}
También hay funciones de utilidad como cada, algunas, etc. que operan en colecciones (Array, Hash). Utilice el método util.xx cuando lo utilice.
Si se define una clase de colección, hay datos de colección dentro de esta clase.
Copie el código de código de la siguiente manera:
función Colección (datos) {
este.datos = datos ||
// algunas otras propiedades
// esto.xxx = yyy
}
Colección.prototipo = {
// algún método
}
Puede copiar fácilmente los métodos de util a la clase de colección, como
Copie el código de código de la siguiente manera:
función copiarMetodo(clazz, obj) {
para (método var en obj) {
clazz.prototipo[método] = función() {
var args = [].slice.call(argumentos)
var objetivo = this.data
args.unshift(objetivo)
obj[método].aplicar(obj, argumentos)
}
}
}
método de copia (Colección, utilidad)
Después de copiar de esta manera, la instancia de Colección tendrá el método en util, y el objeto de colección (primer parámetro) operado por util es this.data de Collection. Puede atravesar this.data directamente de la siguiente manera.
Copie el código de código de la siguiente manera:
var coll = nueva colección ([10, 20, 30])
// atravesar
col.cada uno(función(k) {
consola.log(k)
})
// operar
var arr = coll.map(función(k) {
regresok-5
})
consola.log(arr) // 5, 15, 25
Este patrón se utiliza en muchas bibliotecas de código abierto, como jQuery, cuyo $.each/$.map se copia convenientemente en $().each/$().map.
Otro ejemplo es Backbone, cuyos _.each/_.map/_.every/_.chain (y muchos más) se copian al prototipo de la Colección.
Copie el código de código de la siguiente manera:
// Subraya los métodos que queremos implementar en la Colección.
// El 90% de la utilidad principal de Backbone Collections está realmente implementada
// aquí mismo:
métodos var = ['forEach', 'cada', 'mapa', 'recopilar', 'reducir', 'foldl',
'inyectar', 'reducirDerecha', 'carpeta', 'buscar', 'detectar', 'filtrar', 'seleccionar',
'rechazar', 'cada', 'todos', 'algunos', 'cualquiera', 'incluir', 'contiene', 'invocar',
'max', 'min', 'toArray', 'size', 'first', 'head', 'take', 'inicial', 'rest',
'cola', 'soltar', 'último', 'sin', 'diferencia', 'indexOf', 'shuffle',
'lastIndexOf', 'isEmpty', 'cadena'];
// Mezclar cada método de subrayado como proxy de `Collection#models`.
_.cada uno(métodos, función(método) {
Colección.prototipo[método] = función() {
var args = segmento.call(argumentos);
args.unshift(este.modelos);
return _[método].apply(_, args);
};
});
Además, los métodos prácticos para operar objetos como _.keys / _.values / _.pairs / _.invert / _.pick se copian en Backbone.Model (nuevo en 1.0)
Copie el código de código de la siguiente manera:
var modelMethods = ['claves', 'valores', 'pares', 'invertir', 'seleccionar', 'omitir'];
// Mezclar cada método de subrayado como proxy de `Modelo#atributos`.
_.each(modelMethods, función(método) {
Modelo.prototipo[método] = función() {
var args = segmento.call(argumentos);
args.unshift(this.atributos);
return _[método].apply(_, args);
};
});