2009-09-28 12 views
42

¿Cómo puedo comprobar si mi objeto javascript es de un cierto tipo.Tipo de Javascript de objeto personalizado

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

En el caso anterior typeof s1 volverá "objeto". Eso no es muy útil. ¿Hay alguna forma de verificar si s1 es del tipo SomeObject?

Respuesta

65

Sí, utilizando instanceof (MDN link | spec link):

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

de hecho, se remonta a la primera versión de JavaScript en Netscape 2.0. (Otra razón para no vincularse con ECMA-262 es que es asombrosamente poco claro e ilegible, ¡incluso para estándares de documentos estándar!) – bobince

+0

@bobince: toma algún tiempo acostumbrarse al estilo. :-) –

+0

@bobince: mirando la especificación de ES6 ... bueno ... digamos que ahora estoy ansioso por los días de gloria de la especificación de ES5. :-) –

3

idea robada de http://phpjs.org/functions/get_class/, publicado por SeanJA. Arrancado a trabajar sólo con objetos y sin necesidad de una expresión regular:

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()); 

simplemente he aprendido una manera más fácil para extraer el nombre de la función del constructor:

obj.constructor.name 
10

cualquier cosa que hagas, evitar obj .constructor.name o cualquier versión de cadena del constructor. Que funciona muy bien hasta que afear/Minify su código, entonces todos los saltos desde el constructor se cambió el nombre a algo oscuro (por ejemplo: 'n') y su código será todavía hacer esto y nunca coinciden:

// 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) {} 

(por cierto, necesito más alta reputación para comentar sobre las otras respuestas dignas aquí)

+2

[Ver este enlace] (http://engblog.yext.com/post/js-type-checking). La propiedad del constructor es otra forma interesante de hacerlo. Solo sigue evitando que la cuerda se acerque. – AAron

Cuestiones relacionadas