2013-02-27 23 views
5

Devo verificare se una variabile è un'istanza di oggetto pura. Ad esempio: un HTMLElement è l'istanza dell'oggetto. Ma ho davvero bisogno di verificare se è solo un oggetto, come {a: true, b: false} è. Non può convalidare una matrice.Verificare se è un oggetto

Nota: Posso utilizzare le nuove funzionalità di Chrome, se possibile.

+0

Perché avete bisogno di fare questo? – hugomg

+0

Stai davvero cercando di vedere se un oggetto è un host o un oggetto nativo? Un HTMLElement non è necessariamente un'istanza dell'oggetto Object incorporato. Gli elementi sono oggetti host e quindi non hanno bisogno di seguire alcun particolare modello di ereditarietà (e alcuni browser non ne implementano nessuno, né li implementano come istanze di Object). – RobG

+1

guarda http://api.jquery.com/jQuery.isPlainObject/ nell'origine di jquery http://code.jquery.com/jquery-1.9.1.js e poi chiudi questa domanda finché non sei cieco –

risposta

8

Controllare il costruttore. Seems to work in all browsers

if (a.constructor === Object) 
// Good for arrays 
([]).constructor === Object => false 
// Good for HTMLElements 
document.body.constructor === Object => false 
+0

Grazie per tutte le risposte ... Ma questo è perfetto e veloce per me. Grazie! –

+0

La proprietà del costruttore può essere impostata, quindi facilmente falsificata: 'var a = []; a.constructor = Object; o.constructor === Oggetto; // true' – RobG

+1

@RobG Certo, ci sono molte cose che puoi fare per spararti ai piedi con JS. Puoi anche spoofare 'object .__ proto__' che hai suggerito, ma suppongo che in effetti realizzerebbe qualcosa di Object ??? –

2
var proto = Object.getPrototypeOf(obj); 

var protoproto = Object.getPrototypeOf(proto); 

if (proto === Object.prototype && protoproto === null) { 
    //plain object 
} 

Se sarete creare oggetti con un prototipo null, si potrebbe ottenere liberarsi del protoproto, e basta confrontare proto-Object.prototype o null.

Il pericolo è che non protegge da essere passato Object.prototype stesso, forse causando estensioni accidentali di Object.prototype.


Un po 'più corto e più sicuro in questo modo:

var proto = Object.getPrototypeOf(obj); 

if (proto && Object.getPrototypeOf(proto) === null) { 
    // plain object 
} 

+0

* sidenote: * requisiti minimi per la versione del browser: Firefox 3.5, Chrome 5, IE 9. Vedere: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/getPrototypeOf – Raptor

Problemi correlati