2012-01-03 16 views
6

Quiero comprobar si un objeto está vacío: {}. A continuación se suele utilizar:Cómo probar si el objeto "isEmpty()" si Object.prototype se modificó?

function isEmpty(obj) { 
    for (var prop in obj) { 
    if (obj.hasOwnProperty(prop)) 
     return false; 
    } 
    return true; 
} 

Pero supongamos que el prototipo Object ha sido añadido a las siguientes:

Object.prototype.Foo = "bar"; 

Pruebas:

alert(isEmpty({}));    // true 
Object.prototype.Foo = "bar"; 
alert({}.Foo);     // "bar" oh no... 
alert(isEmpty({}));    // true ...**huh?!** 

he tratado de bombardear prototipo del objeto, cambie su constructor, y todo tipo de tales hacks. Nada funcionó, pero tal vez lo hice mal (probable).

+0

En realidad, me acabo de dar cuenta de que esta pregunta probablemente está formulada incorrectamente, tal vez debería ser: _ "cómo probar si se cambió una cadena de prototipos" _? –

+0

... y la única forma en que se me ocurre es codificar todas las propiedades para "Objeto", "Número", "Matriz", etc., y verificar que no haya nada fuera de las propiedades conocidas. Muy desordenado. Aunque me gustaría hacer esto en una prueba unitaria para ver que nadie haya colado algo en los tipos primitivos, algo de lo que siempre he sospechado (porque podría explotar mi código río abajo y me resultaría difícil localizar el problema) . –

+0

lea esto: http://www.3site.eu/doc/ – diEcho

Respuesta

3

Basta con retirar el filtro obj.hasOwnProperty:

function isEmpty(obj) { 
    for (var prop in obj) { 
    return false; 
    } 
    return true; 
} 

DEMO

De esta manera también le dirá si contiene cualquier propiedad o si algo está en la cadena de prototipo, si eso es lo que quiere.

alternativa, se puede cambiar

if (obj.hasOwnProperty(prop)) 

a

if (!obj.hasOwnProperty(prop)) 

si sólo desea saber si algo es jugar con su prototipo.

+0

¿Podría ser ... tan simple y obvio? Me pregunto por qué mi versión de la función es la más utilizada (y se recomienda en docenas de respuestas en este mismo sitio). Esto de hecho funciona, pero quiero conectarlo a mis pruebas para ver si algo explota inesperadamente. –

+0

@PeterMarks: generalmente 'hasOwnProperty' se usa para ignorar las propiedades que se heredan, pero como usted está interesado en accesorios heredados, el filtro es contraproducente. – qwertymk

+0

FWIW, JSlint se queja al eliminar la comprobación '' hasOwnProperty''. Sin saber por qué. Hay algo más en esto que no entiendo. –

Cuestiones relacionadas