我正在将我的所有JavaScript类转换为Backbone模型。最初,当我在Google Chrome中使用Javascript调试器时,我的对象将显示为DataNode
类型。
这是之前的代码示例。
var DataNode = { name: function() { return "hello world"; } };
将其转换为Backbone模型后,它现在在调试器中显示为child
。
现在和Backbone模型一样。
var DataNode = Backbone.Model.extend({ name: function() { return "hello world"; } });
当我查看变量DataNode
时,chrome表示其类型为child
,而不是之前的DataNode
。
现在,对于从Backbone模型扩展的所有对象,都会发生这种情况。现在有点痛,因为当我有一堆模型时,我不知道哪个是哪个。
答案 0 :(得分:3)
欢迎来到JS中类的名称问题。
事实上,你的课程实际上根本没有名字。在这种情况下,您的浏览器将尝试为对象提供适当的名称。如果你没有做任何复杂的事情,就像你之前做的那样,即创建一个类,实例化一个对象,你的浏览器将看不到类名,并且通常会给它包含该类的var的名称。
你可能已经想过(或想过):
var MyClass = function() {};
和
var MyClass = function MyClass() {};
是一样的。你错了。第二种是(据我所知)给你的班级命名的唯一方法。尝试两种情况:console.log((new MyClass).constructor.name)
。第一个会给你一个空字符串,第二个会给你一个MyClass。
现在不要被愚弄。你可能会想“我只需要设置constructor.name”。构造函数属性的每个属性都受到保护,您无法自己设置它们。所以这就是问题所在。你使用Backbone创建类的方式,我无法想到设置类名(或者可能是eval,但不是。)。
所以我说的是,你的事业已经失去了。再一次,我不了解JS的一切,可能会遗漏一些东西。
如果您有兴趣了解函数的构造函数属性:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function
答案 1 :(得分:1)
似乎您可以使用命名函数表达式覆盖构造函数属性,如Dan Malcom在Debugging Javascript (Backbone and Marionette)问题中所述。相关代码片段:
var Product = Backbone.Model.extend({
constructor: function Product() {
Backbone.Model.prototype.constructor.apply(this, arguments);
}
});
关键是function Product()
部分。 Here是源的扩展函数中发生的地方。