自定义Backbone.Model创建

时间:2013-12-22 06:17:24

标签: backbone.js model constructor prototype

如何扩展Backbone.Model

MyModel = Backbone.Model.extend({ ... });

以便写作

model = new MyModel(object)

返回object本身,以防它已经是模型, 否则会创建新的Backbone模型?

我有一个自定义函数isModel(object)来检查object是否为模型。

1 个答案:

答案 0 :(得分:2)

我认为一个简单的类方法可以减少尝试改变Backbone构造函数的工作方式。 extend的属性第二个对象参数作为属性添加到构造函数中,因此您可以执行以下操作:

var MyModel = Backbone.Model.extend({
    // Standard model stuff goes here...
}, {
    toMyModel: function(object) {
        if(isModel(object))
            return object;
        return new MyModel(object);
    }
});

然后是:

var o = MyModel.toMyModel(someObject);

如果someObject已经是MyModel,那么您将获得o === someObject,否则您将new MyModel(someObject)中获得o

演示:http://jsfiddle.net/ambiguous/h38Ks/


如果你担心会说:

new MyCollection([ myModel, someObject ])

然后没有什么可担心的,Backbone会为你检查一下。我没有看到任何有关此行为的文件保证,但是:

  1. 该集合知道它应该包含哪种模型(通过其model属性),因此它可以快速进行instanceof检查。
  2. 如果您浏览代码,您会看到调出collection constructorreset来电add调用set来调用_prepareModel进行转换对象建模实例;您会在instanceof顶部找到_prepareModel支票。
  3. 请注意,_prepareModel将接受任何Backbone.Model个实例,而不仅仅是集合model的实例。除非你的代码真的很混乱,否则这不应该是一个问题。

    你可以看到这个“它已经是模特吗?”在这里采取行动:http://jsfiddle.net/ambiguous/YCdV7/