2009-09-28 12 views
42

Come posso verificare se il mio oggetto javascript è di un certo tipo.Tipo di Javascript di oggetto personalizzato

var SomeObject = function() { } 
var s1 = new SomeObject(); 

Nel caso sopra typeof s1 torneranno "oggetto". Non è molto utile. C'è un modo per verificare se s1 è di tipo SomeObject?

risposta

65

Sì, utilizzando instanceof (MDN link | spec link):

if (s1 instanceof SomeObject) { ... } 
+0

Infatti, risale al primo JavaScript versione Netscape 2.0. (Un altro motivo per non collegarsi all'ECMA-262 è che è incredibilmente poco chiaro e illeggibile, anche per gli standard dei documenti standard!) – bobince

+0

@bobince: Ci vuole un po 'per abituarsi allo stile. :-) –

+0

@bobince: guardando le specifiche ES6 ... beh ... diciamo che ora mi sto appassionando attivamente ai gloriosi giorni di chiarezza delle specifiche ES5. :-) –

3

Idea rubata da http://phpjs.org/functions/get_class/, pubblicato da SeanJA. Strappato al lavoro con solo oggetti e senza bisogno di un'espressione regolare:

function GetInstanceType(obj) 
{ 
    var str = obj.constructor.toString(); 
    return str.substring(9, str.indexOf("(")); 
} 

function Foo() { 
    this.abc = 123; 
} 

// will print "Foo" 
GetInstanceType(new Foo()); 

Ho appena appreso un modo più semplice per estrarre il nome della funzione dal costruttore:

obj.constructor.name 
10

Qualunque cosa tu faccia, evitare obj .constructor.name o qualsiasi versione di stringa del costruttore. Che le grandi opere fino a uglify/minimizzazione dei vostro codice, allora si scatena in quanto il costruttore viene rinominato in qualcosa di oscuro (es: 'n') e il codice sarà ancora fare questo e mai partita:

// Note: when uglified, the constructor may be renamed to 'n' (or whatever), 
// which breaks this code since the strings are left alone. 
if (obj.constructor.name === 'SomeObject') {} 

Nota:

// Even if uglified/minified, this will work since SomeObject will 
// universally be changed to something like 'n'. 
if (obj instanceof SomeObject) {} 

(BTW, ho bisogno di grandi reputazione commentare le altre risposte degne qui)

+2

[Vedere questo collegamento] (http://engblog.yext.com/post/js-type-checking). La proprietà del costruttore è un altro modo interessante di andare. Basta continuare ad evitare gli approcci di stringa. – AAron

Problemi correlati