2011-10-21 13 views
8
jQuery(); //[] 
jQuery("#footer"); //[<div id="footer">...</div>] 

sé que se puede hacer algo como esto:¿Cómo hace jQuery que el valor devuelto parezca una matriz?

function kablam(tag) { 
    var els = document.getElementsByTagName(tag); 
    els.isKablam = true; 
    return els; 
} 
var body = kablam("body"); //[<body class="ask-page">...</body>] 
body.isKablam; //true 

Para regresar una versión "extendida" de la NodeList que se devuelve del document.getElementsByTagName.

Sin embargo, jQuery hace lo contrario. Se fusiona el resultado en sí mismo (como se puede ver here y here). Por otra parte, eso no explica cómo se devuelve una matriz-como-objeto-que-mira-como-un-array cuando pase nada a ella:

jQuery(); //[] 

Cuando se hace esto, simplemente devuelve jQuery sí. (source)

O a la misma extender, cuando se selecciona el cuerpo de la etiqueta:

jQuery("body"); //[<body class="ask-page">...</body>] 

(source)

O, ahora que lo pienso de ella, nada en absoluto:

var o = {}, body = document.getElementsByTagName("body"); 
jQuery.merge(o, body); //Object, not [...] 

Devolver objetos similares a una matriz es muy fácil, ya que la asignación de teclas numéricas es trivial y no es diferente de asignar cualquier otra tecla. Pero, ¿cómo hace jQuery para que parezca una matriz?

Respuesta

7

Debe definir .length, .splice y .push en un prototipo para que se muestre como una matriz.

Alguna otra combinación de métodos de matriz también puede funcionar.

Example

+1

Estoy bastante seguro de que '.push' no es necesario :) –

+1

Además, no es necesario que esté en el prototipo. Pruebe esto en la consola: 'a = {length: 0, splice: function() {}}' – Shmiddty

0

¿Qué es "parezca una matriz" en su opinión? ¿Cómo comprobarías la variedad? Si considera que todo lo que tiene una longitud es una matriz, todo lo que necesita para que un objeto se vea como una matriz es definir la propiedad de longitud. jQuery haz eso.

+0

Por eso me separé tipo array y matriz de aspecto similar. Se considera que Array-like tiene una longitud e índices numéricos (los cuales son triviales). La respuesta más breve para array-look-similar es que cuando la registra, cree que está mirando una matriz. – Zirak

+0

@bjornd en este caso "parece una matriz" significa que el depurador/consola/dev-tools en los navegadores lo imprime como una matriz – Raynos

+0

@Zirak, @Raynos Por lo tanto, depende únicamente de cómo depurador/consola/dev-tools manejan tipos de objetos. Por ejemplo, pueden verificar 'object instanceof Array' o verificar la longitud u otra propiedad específica de la matriz. – bjornd

Cuestiones relacionadas