将骨干中的模型的现有实例扩展/转换为派生模型的实例(如在java中强制转换)

时间:2016-07-05 10:43:02

标签: javascript backbone.js web


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


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

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**

我不想克隆模型&#39; a&#39;因为我可能会改变&#39; a&#39;在其他地方,我想看到的还有&#39; b&#39;改变了(同一个对象) 谢谢 我不想克隆模型&#39; a&#39;因为我可能会改变&#39; a&#39;在其他地方,我想看到的还有&#39; b&#39;改变了(同一个对象) 感谢

2 个答案:

答案 0 :(得分:0)

我认为你可以做到:

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

答案 1 :(得分:0)

如何使用_.extend?

类似的东西:

var AModel = Backbone.Model.extend(...);
var BModel = Backbone.Model.extend(...);

var a = new AModel();

_.extend(a, BModel.prototype);

我在小提琴中尝试了这个,似乎正常工作

在我的控制台中调用a.foo()导致foo of b。我很快就用事件测试了它们,它们似乎保持不变。可能会有我遗漏的副作用。