2011-12-29 13 views
8

Tengo curiosidad acerca de si hay alguna forma de falsificar Array.isArray() con un objeto definido por el usuario.¿Puede falsificar Array.isArray() con un objeto definido por el usuario?

Del libro Patrones de JavaScript:

Array.isArray([]); // true 

// trying to fool the check 
// with an array-like object 
Array.isArray({ 
    length: 1, 
    "0": 1, 
    slice: function() {} 
}); // false 

ese objeto claramente falla, pero ¿hay alguna otra manera de hacerlo? Esto es pura curiosidad, y no porque yo piense que podrías atornillar con .isArray() en el código de cliente habitual (¡aunque obviamente sería fantástico saber si podrías!).

Respuesta

9

Solo si configura el internal [[Class]] property en "Array", que no es posible afaik. Desde el specification:

La función isArray toma un argumento arg, y devuelve el valor booleano true si el argumento es un objeto cuya clase de resistencia interna es "Matriz"; de lo contrario, devuelve false.

O bien, al revés: crea una matriz normal y establece explícitamente cada método de matriz en undefined.

+0

Ahora que me has pedirá que hacer una pregunta de seguimiento: http://stackoverflow.com/questions/8672204/can- you-set-the-internal-class-property-of-a-ecmascript-object –

10

Array.isArray = function() { return true; }

Y si quieres ser malo

Array.isArray.toString = function() { 
    return 'function() { [native code] }'; 
}; 
+0

Ambas soluciones son bastante malas. Este es un cambio global que puede romper otras partes del sitio/aplicación. –

Cuestiones relacionadas