Backbone.js 自定义主干。模型创建

Backbone.js 自定义主干。模型创建,backbone.js,model,constructor,prototype,Backbone.js,Model,Constructor,Prototype,如何扩展主干网。型号: MyModel = Backbone.Model.extend({ ... }); 因此,写作 model = new MyModel(object) 如果对象本身已经是模型,则返回对象本身, 否则会创建新的主干模型吗 我有一个自定义函数isModel(object)来检查object是否是一个模型。我认为一个简单的类方法会比尝试改变主干构造函数的工作方式更容易混淆。properties第二个对象参数作为属性添加到构造函数上,因此您可以执行以下操作: var MyMo

如何扩展主干网。型号:

MyModel = Backbone.Model.extend({ ... });
因此,写作

model = new MyModel(object)
如果对象本身已经是模型,则返回对象本身, 否则会创建新的主干模型吗


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

我认为一个简单的类方法会比尝试改变主干构造函数的工作方式更容易混淆。properties第二个对象参数作为属性添加到构造函数上,因此您可以执行以下操作:

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
,否则你会在
o
中得到
新的MyModel(someObject)

演示:


如果你担心说这样的话:

new MyCollection([ myModel, someObject ])
那就没什么好担心的了,我会帮你检查的。我没有看到任何关于这种行为的书面保证,但是:

  • 集合知道它应该包含什么类型的模型(通过它的属性),因此它可以进行快速的
    instanceof
    检查
  • 如果跟踪代码,您将看到调用which调用which调用which调用将对象转换为模型实例;您将在
    \u prepareModel
    的顶部找到
    instanceof
    复选框
  • 请注意,
    \u prepareModel
    将接受任何
    主干.Model
    实例,而不仅仅是集合的
    模型的实例。这应该不是问题,除非你的代码真的很混乱


    你可以在这里看到“它已经是一个模型了吗?”这句话:

    谢谢,好主意,唯一的一件事是我的模型创建是通过将数组传递给集合构造函数来完成的,所以我必须重写后者,这也是同样的问题。你确定集合不会为你执行该检查吗?粗略地检查一下消息来源,就可以看出可能是这样。我现在在我的平板电脑上,但我可以在早上进一步检查。看来你是对的。没有想到,事情可能比看起来容易:)我只是运行了主干代码,找到“这东西已经是模型了吗?”检查。是的,我看到了。模型和集合在这里的工作方式有所不同,这有点违反直觉。如果
    model
    已经是一个模型,那么
    new Backbone.model(model)
    没有理由像当前那样创建一个混乱的新模型。