È possibile interrogare l'albero di ereditarietà (aka catena di prototipi) per l'istanza oggetto come questo:
oggetto .__ proto __.__ proto __.__ proto__
È possibile visualizzare ciò che è disponibile. Qualsiasi proprietà del nome del tipo dovrà essere aggiunta dall'utente a ogni vista e/o modello manualmente. Questo è il modo più pulito per andare. Lo raccomando. Aggiungi semplicemente "className:" MyCompany.MyProject.MyArea.MyView "" a ciascuna delle tue visualizzazioni e/o modelli.
Se non si aggiunge una proprietà className agli oggetti, c'è un modo un po 'hacky per ottenere ancora (ad esempio per scopi di output di debug):
Supponendo di fare qualcosa di simile: "MyCompany.MyProject. MyArea.MyView = Backbone.View.extend ({"il nome della classe vista/modello si trova in un nome var globale dello spazio dei nomi. Dall'istanza dell'oggetto non è possibile raggiungere il nome globale var. Quindi, anche se non proprio ideale, il meglio che possiamo fare è attraversare lo spazio dei nomi alla ricerca del 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);
Idealmente si utilizza uno spazio dei nomi per i tipi diversi da "finestra" Questo rende molto più pulito e più facile da attraversare. Sostituisci semplicemente "finestra" con la base del tuo spazio dei nomi e passa il prefisso desiderato se vuoi che sia prefissato correttamente. Puoi anche rimuovere un paio di linee come try..catch e if..continue.
findBackboneClassName(MyCompany.MyProject, myBackboneViewInstance, "MyCompany.MyProject");
Il trucco di ottenere il nome della classe da objectInstance.constructor non funziona per la spina dorsale a causa del modo in cui funziona l'ereditarietà. Tutti i castori hanno lo stesso aspetto per me: "function() {return parent.apply (this, arguments);}".
Devi essere più specifico. Un modello potrebbe avere più viste. La vista ha il riferimento .el che AFAIK dovrebbe essere sufficiente, * se stai considerando le viste *. Ma potrebbe non essere quello che stai chiedendo. – JayC
Ah, non importa. Stai parlando a livello di codice. – JayC
Perché hai bisogno del nome di classe? Per creare un nuovo modello dello stesso tipo o per accedere a una funzione di livello di classe o qualcos'altro? La sua domanda interessante – websymphony