2011-08-07 12 views
12

¿Hay una manera fiable de obtener la instancia de un objeto de JavaScript?Javascript a obtener el tipo/nombre de instancia

Por ejemplo, basándose en el 'obj.getInstance()' función falso.

var T = { 
    Q: { 
     W: { 
      C: function() {} 
     } 
    } 
}; 

var x = new T.Q.W.C(); 
console.log(x.getInstance() === T.Q.W.C); // should output true 

Si esto no es parte de la especificación ECMA, por favor incluya el navegador/apoyo Node.js y compatibilidad en las respuestas.

+1

Yo creo que hay que reformular la pregunta. 'x' * es * una instancia y sí, usar' new' es bastante confiable para obtener una instancia. Tal vez estás buscando 'instancof', para obtener el tipo de la instancia? https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special/instanceof –

Respuesta

19

para obtener un puntero a la función de creación de instancias (que no es una "clase", pero es el tipo ), utilice obj.constructor donde obj es cualquier objeto.


En JavaScript no hay clases. Como tal, no hay instancias de clase en JavaScript. Solo hay objetos Los objetos heredan de otros objetos (sus llamados prototipos). Lo que estás haciendo en tu código es literalmente definir un objeto T, cuyo atributo Q es otro objeto, cuyo atributo W es otro objeto, cuyo atributo C es una función.

Cuando está "creando una nueva instancia de T.Q.W.C", en realidad se está llamando la única función T.Q.W.C como constructor. Una función denominada como un constructor devolverá un nuevo objeto en la que se denomina función de constructor (es decir, con this beeing el nuevo objeto, como constructorFunction.apply(newObject, arguments);). Ese objeto devuelto tendrá una propiedad oculta constructor que apuntará a la función invocada como constrcutor para crear el objeto. Además, hay una función de idioma que le permite probar si se utilizó una función determinada como función constructora para un objeto utilizando el operador instanceof.

por lo que podría hacer lo siguiente:

console.log(x instanceof T.Q.W.C); 

O

console.log(x.constructor === T.Q.W.C); 
+1

espero que no le importe las ediciones. –

+0

La siguiente respuesta responde la pregunta. – ekerner

4

tuve algunos problemas con esto, la solución era:

String(x.constructor) === String(T.Q.W.C) 
12

Sólo probado en Chrome:

function FooBar() { 

} 

var foobar = new FooBar(); 

console.log(foobar.constructor.name); // Prints 'FooBar' 
4

Por si alguien todavía está leyendo esto en 2017:

tener cuidado al usar obj.constructor, ya que no es una propiedad inmutable.

El operador instanceof es generalmente más fiable. También puede utilizar Object.getPrototypeOf(obj):

var arr = []; 
arr instanceof Array; // true 
Object.getPrototypeOf(arr); // Array [ ] 
Object.getPrototypeOf(arr) === Array.prototype; // true 

ver este documento útil sobre el tema:

https://github.com/getify/You-Dont-Know-JS/blob/master/this%20%26%20object%20prototypes/ch5.md

Cuestiones relacionadas