您可以像这样查询对象实例的继承树(又名原型链):
object.__proto__.__proto__.__proto__
您可以查看可用的内容。您必须手动将任何类型名称属性添加到每个视图和/或模型中。这是最干净的方法。我推荐这个。只需将 'className: "MyCompany.MyProject.MyArea.MyView"' 添加到您的每个视图和/或模型中。
如果你没有为你的对象添加一个 className 属性,有一个稍微笨拙的方法仍然可以得到它(例如用于调试输出目的):
假设您执行以下操作:“MyCompany.MyProject.MyArea.MyView = Backbone.View.extend({”视图/模型类名称位于全局命名空间变量名称中。从对象实例我们无法访问该全局变量所以虽然不是很理想,但我们能做的最好的就是遍历命名空间寻找 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);
理想情况下,您为“窗口”以外的类型使用命名空间。这使得它更清洁,更容易遍历。您只需将“window”替换为命名空间的基础,并传入所需的前缀(如果您希望它的前缀正确)。您还可以删除几行,例如 try..catch 和 if..continue。
findBackboneClassName(MyCompany.MyProject, myBackboneViewInstance, "MyCompany.MyProject");
从 objectInstance.constructor 获取类名的技巧不适用于主干,因为它进行继承的方式。所有 ctor 对我来说都一样:“function () { return parent.apply(this, arguments); }”。