2012-01-03 15 views
6

Voglio verificare se un oggetto è vuoto: {}. Quanto segue è in genere utilizzato:Come verificare se object "isEmpty()" se Object.prototype è stato modificato?

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

Ma supponiamo che il prototipo Object inserito il seguente:

Object.prototype.Foo = "bar"; 

Test:

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

ho cercato di bombardare il prototipo dell'oggetto, cambiare è costruttore e tutti i tipi di tali hack. Niente ha funzionato, ma forse l'ho fatto male (probabile).

+0

In realtà ho appena realizzato che questa domanda è probabilmente formulata in modo errato, dovrebbe essere: _ "come verificare se una catena di prototipi è stata modificata" _? –

+0

... e l'unico modo in cui riesco a pensare è quello di codificare hardicamente ogni proprietà per "Oggetto", "Numero", "Array", ecc. E controllare che non ci sia nulla al di fuori delle proprietà conosciute. Abbastanza disordinato Anche se mi piacerebbe farlo in un test unitario per vedere che nessuno ha nascosto qualcosa nei tipi primitivi, di cui sono sempre stato sospettoso (perché potrebbe far saltare il mio codice a valle e farei fatica a rintracciare il problema) . –

+0

leggi questo: http://www.3site.eu/doc/ – diEcho

risposta

3

è sufficiente rimuovere il filtro obj.hasOwnProperty:

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

DEMO

In questo modo vi dirà anche se contiene tutte le proprietà o se tutto è nella catena di prototipi, se è questo che vuoi.

In alternativa è possibile modificare

if (obj.hasOwnProperty(prop)) 

a

if (!obj.hasOwnProperty(prop)) 

se solo volete sapere se qualcosa è pasticciano con il suo prototipo.

+0

Potrebbe essere ... così semplice e ovvio? Mi chiedo perché la mia versione della funzione sia quella più usata (e raccomandata in dozzine di risposte su questo stesso sito). Questo funziona davvero, ma voglio inserirlo nei miei test per vedere se qualcosa esplode inaspettatamente. –

+0

@PeterMarks: in genere 'hasOwnProperty' viene utilizzato per ignorare le proprietà ereditate, ma poiché si è interessati a oggetti di scena ereditati, il filtro è controproducente. – qwertymk

+0

FWIW, JSlint si lamenta durante la rimozione del controllo '' hasOwnProperty''. Non so perché, però. C'è qualcosa di più in questo che non riesco a ottenere. –

Problemi correlati