2012-07-14 17 views
5

Estaba jugando con clase/función/herencia de prototipo un poco y obtuve una configuración decente funcionando. Algo simple que entiendo.Obtenga el 'nombre de clase' actual después de la herencia de clase/prototipo

http://jsfiddle.net/rudiedirkx/rwPeD/6/

Para propósitos de depuración, quería imprimir en cada constructor de qué tipo de objeto se llama ese constructor. Por ejemplo, el constructor de Ronin llama al constructor de Ninja y llama al constructor de Person. Para que hice una función get_class:

function get_class(obj) { 
    var C = String(obj.__proto__.constructor); 
    return C.match(/function (\w+)\(/, C)[1]; 
} 

y que no funciona. Siempre devuelve "Persona". ¿Por qué? Cada 'clase' tiene su propio constructor, ¿no es así? Si hago un console.log(this) en cada constructor, Chrome Devtools sabe de qué tipo es el objeto. ¿Cómo puedo llegar allí (con JS vainilla)?

PS. salida completa en mi Chrome:

Chrome Devtools output

+0

posible duplicado de [¿Por qué necesita para restablecer el javascript constructor durante la herencia?] (Http://stackoverflow.com/questions/13222696/why-do -you-need-to-reset-javascript-constructor-during-inheritance) – Bergi

Respuesta

3

O usted podría hacer algo que realmente funciona ...

function getClass(obj) { 
    return obj.__proto__.constructor.name; 
} 

obj.attr ("clase") sólo funciona si existe el método attr con ella no lo hará en un entorno nativo.

Todavía su sugerencia fue muy buena en su diseño.

Tenga en cuenta que proto .constructor.name siempre devolverá "objeto" si la clase no es una clase nativa, tales como Array, String, RegExp, errores, etc ... Si alguien sabe cómo convencer al "nombre" de la propiedad para devolver el nombre real, incluso si tengo que agregar código para hacerlo, le compraría un plátano para su problema.

+0

Si 'obj .__ proto __. constructor' siempre devuelve el constructor' Person', entonces 'obj .__ proto __. constructor.name' siempre devolverá" Person " ... Este es exactamente el mismo método que probé y eso no es todo. Si funciona para usted, ¿puede implementarlo en http://jsfiddle.net/rudiedirkx/rwPeD/6/? Gracias – Rudie

+0

no funciona cuando los scripts se cargan dinámicamente (por ejemplo, require.js) – catbadger

+0

mensaje de error: this.__proto__.constructor.name no es una función –

0

Creo que el problema se refiere a la siguiente línea. this.prototype.constructor apunta a lo que apunta Person.prototype.

this.prototype = Object.create(sup.prototype); 

Es posible que deba cambiar su referencia explícitamente.

this.prototype.constructor = this; 

La pregunta similar se puede encontrar en Get name of derived constructor in Javascript

Cuestiones relacionadas