0

我正在将我所有的 JavaScript 类转换为 Backbone 模型。最初,当我在 Google Chrome 中使用 Javascript 调试器时,我的对象会显示为 type DataNode

这是之前的代码示例。

 var DataNode = { name: function() { return "hello world"; } };

将其转换为 Backbone 模型后,它现在在调试器中显示为child.

现在和 Backbone 模型做同样的事情。

 var DataNode = Backbone.Model.extend({ name: function() { return "hello world"; } });

当我查看变量DataNodechrome 时说它的类型是child而不是DataNode像以前那样。

对于从 Backbone 模型扩展的所有对象,现在都在发生这种情况。现在有点痛苦,因为当我有一堆模型时,我不知道哪个是哪个。

4

2 回答 2

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

于 2013-04-11T18:29:38.553 回答
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()零件。是它在源的扩展功能中发生的地方。

于 2015-05-27T23:21:27.770 回答