Вы можете запросить дерево наследования (также называемое цепочкой прототипов) для вашего экземпляра объекта следующим образом:
object .__ proto __.__ proto __.__ proto __
Вы можете увидеть, что доступно.Любое свойство имени типа должно быть добавлено вами к каждому виду и / или модели вручную.Это самый чистый путь.Я рекомендую это.Просто добавьте 'className: "MyCompany.MyProject.MyArea.MyView" "к каждому из ваших представлений и / или моделей.
Если вы не добавляете свойство className к своим объектам, есть немного хакерский способчтобы получить его (например, для целей отладки):
Предполагая, что вы делаете что-то вроде: "MyCompany.MyProject.MyArea.MyView = Backbone.View.extend ({" имя класса представления / модели находится вглобальное имя переменной пространства имен. Из экземпляра объекта мы не можем получить это глобальное имя переменной. Поэтому, хотя это и не совсем идеально, лучшее, что мы можем сделать, это пересечь пространство имен в поисках переменной:
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);
В идеале вы используетепространство имен для ваших типов, отличных от «окна». Это делает его намного чище и проще для прохождения. Вы просто заменяете «окно» на базу вашего пространства имен и передаете желаемый префикс, если хотите, чтобы он был префикс надлежащим. Вы также можете удалитьпара строк, таких как try..catch и if..continue.
findBackboneClassName(MyCompany.MyProject, myBackboneViewInstance, "MyCompany.MyProject");
Трюк получения имени класса из objectInstance.constructor не работаетрк для позвоночника из-за того, как он наследует.Все ctors выглядят одинаково для меня: "function () {return parent.apply (this, arguments);}".