Backbone.js在扩展后将对象重命名为“child”

时间:2013-04-11 17:22:09

标签: javascript jquery backbone.js

我正在将我的所有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模型扩展的所有对象,都会发生这种情况。现在有点痛,因为当我有一堆模型时,我不知道哪个是哪个。

2 个答案:

答案 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是源的扩展函数中发生的地方。