将主干中现有的模型实例扩展/强制转换为派生模型的实例(类似于java中的强制转换)




我有一个问题,将现有的模型实例扩展到主干中的其他类型的派生模型,这可能吗
如果是,这是我需要做的一个例子,请帮助:


我有一个问题,将现有的模型实例扩展到主干中的其他类型的派生模型,这可能吗
如果是,这是我需要做的一个例子,请帮助:

var A = Backbone.Model.extend({
    initialize: function(options){
        console.log('A initialized');
    },
    foo : function(){
        console.log('foo of A');
    }
});
var B = Backbone.Model.extend({
    initialize: function(options){
        A.prototype.initialize.apply(this, [options]);
        console.log('B initialized');
    },
    foo : function(){
        console.log('foo of B');
    },
    goo : function(){
        console.log('goo of B');
    }
});
var ACollection = Backbone.Collection.extend({
    model: A
});
var BCollection = Backbone.Collection.extend({
    model: B
});
var aa = new ACollection();
var bb = new BCollection();
aa.add(new A({
    attr1:1,
    attr2:2,
    attr3:3
})); // **A initialized**
// later after a while
var a = aa.at(0);
var b = cast a to type B    <---- how to do this
bb.add(b);
// later after a while
console.log(bb.at(0).get('attr1')); // **1**
b.goo(); // **goo of B**
b.foo(); // **foo of B**
a.set({attr1:'new1'});
console.log(bb.at(0).get('attr1')); // **new1**

我不想克隆模型"a",因为我可能会在其他地方更改"a"的属性,并且我希望看到"b"也发生了更改(同一对象(谢谢我不想克隆模型"a",因为我可能会在其他地方更改"a"的属性,并且我希望看到"b"也发生了更改(同一对象(感谢

我认为你可以做到:

var a = ACollection.at(0);
var b = new B(a.toJSON()); // create a B instance with data from instance a?

如果您想将其添加到bb集合,只需:

bb.create(a.toJSON()); // executes  new B() internally

使用_.extend怎么样?

类似于:

var AModel = Backbone.Model.extend(...);
var BModel = Backbone.Model.extend(...);
var a = new AModel();
_.extend(a, BModel.prototype);

我用小提琴试了一下,效果似乎不错。

调用a.foo()导致我的控制台中出现foo of b。我很快就用事件进行了测试,它们似乎完好无损。我可能错过了一些副作用。

最新更新