puede consultar el árbol de herencia (también conocido como cadena de prototipos) para la instancia de objeto como éste:
objeto .__ proto __.__ proto __.__ proto__
Puedes ver que hay disponible. Cualquier propiedad de nombre de tipo deberá ser agregada por usted a cada vista y/o modelo manualmente. Esta es la manera más limpia de ir. Recomiendo esto Simplemente agregue 'className: "MyCompany.MyProject.MyArea.MyView"' a cada una de sus vistas y/o modelos.
Si no se agrega una propiedad className a los objetos, hay una manera un poco hacky todavía conseguirlo (por ejemplo, para la salida de depuración):
Asumiendo que hacer algo como: "MyCompany.MyProject. MyArea.MyView = Backbone.View.extend ({"el nombre de clase de vista/modelo está en un nombre de var de espacio de nombres global. De la instancia de objeto no podemos alcanzar ese nombre var global. Por lo tanto, aunque no es realmente ideal, lo mejor que podemos hacer es atravesar el espacio de nombres en busca de la var:.
function findBackboneClassName(ns, object, prefix, depth) {
prefix = typeof prefix !== 'undefined' ? prefix : "";
depth = typeof depth !== 'undefined' ? depth : 0;
if (depth > 5) return null;
for (i in ns) {
try { ns[i]; } catch (e) { continue; }
if (/top|window|document|parent|frames|self|chrome|form|theForm/.test(i)) continue;
//console.log(">" + prefix + "." + i + " " + typeof(ns[i]));
if (ns[i] == object.constructor) {
//console.log("Found:", prefix + "." + i);
return prefix + "." + i;
}
if (typeof (ns[i]) == "object") {
var r = findBackboneClassName(ns[i], object, prefix + (prefix != "" ? "." : "") + i, depth + 1);
if (r != null) return r;
}
}
return null;
}
findBackboneClassName(window, myBackboneViewInstance);
lo ideal sería que usted está usando un espacio de nombres para sus tipos distintos de "ventana" Eso hace que sea mucho más limpio y más fácil de atravesar Simplemente reemplace "ventana" con la base de su espacio de nombres y pase el prefijo deseado si lo quiere con el prefijo correcto. También puedes eliminar un par de líneas como try..catch y if..continue.
findBackboneClassName(MyCompany.MyProject, myBackboneViewInstance, "MyCompany.MyProject");
El truco de hacer que el nombre de clase de objectInstance.constructor no funciona para la columna vertebral debido a la manera que lo hace la herencia. Todos los ctors tienen el mismo aspecto para mí: "function() {return parent.apply (this, arguments);}".
Tiene que ser más específico. Un modelo podría tener múltiples vistas. La vista tiene la referencia .el que AFAIK debería ser suficiente, * si está considerando vistas *. Pero puede que eso no sea lo que preguntas. – JayC
Ah, no importa. Estás hablando programáticamente. – JayC
¿Por qué necesita el nombre de clase? ¿Crear un nuevo modelo del mismo tipo o acceder a una función de nivel de clase u otra cosa? Su pregunta interesante – websymphony