骨干:将模型转换为不同模型类的最佳方法

时间:2014-05-21 23:43:49

标签: javascript backbone.js

我有几个Backbone模型:

var MainThing = Backbone.Model(/* some methods */);

var CustomerFacingThing = MainThing.extend(/* overrides of those methods */);

在我的代码中的几个地方,我有一个MainThing实例,但我想将其转换为CustomerFacingThing,以便我可以将其传递给我的客户编写的代码:

var mainThing = new MainThing();
customerFunction(mainThing.convertToCustomerFacingThing());

我的问题是,最好的方法是什么?我能想到的一种方法就是改变原型:

mainThing.prototype = CustomerFacingThing.prototype;

但是这不会改变隐藏的原型"所以我不确定这会起作用(例如,我不确定mainThing instanceof CustomerFacingThing会是什么true)。

我还可以将属性和事件复制到新的CustomerFacingThing实例:

var customerFacingVersion = new CustomerFacingThing();
customerFacingVersion.attributes = mainThing.attributes;
customerFacingVersion.events = mainThing.events;

但由于事件已经受到约束,我不确定是否也能正常工作。此外,mainThing可能具有非属性属性,所以我真的必须这样做:

_(mainThing).each(function(value, key) {
    customerFacingThing[key] = value;
});

但这将覆盖实例上面向客户的方法,并使用这些方法的主要版本。

那么,任何人都可以解释更改Backbone.Model实例的类的最佳方法吗?

1 个答案:

答案 0 :(得分:1)

我建议使用CustomerFacingThing构造函数 - 并将MainThing作为参数传递 由于Backbone.Models将其数据存储在属性中,因此下面的代码应该相同:

var mainThing = new MainThing();
var customerThing = new CustomerThing();
mainThing.get('propertyName') == customerThing.get('propertyName');

然后,您可以在构造函数中使用以下代码:
请注意,这是TypeScript语法。

class ListItem extends Backbone.Model implements IListItem {
    get Id(): number { return this.get('Id'); }
    set Id(value: number) { this.set('Id', value); }
    set Name(value: string) { this.set('Name', value); }
    get Name(): string { return this.get('Name'); }

    constructor(input: IListItem) {
        super();
        for (var key in input) {
            if (key) {
                this[key] = input[key];
            }
        }
    }
}

此技术的详细信息可在此处找到:http://blorkfish.wordpress.com/2013/03/20/typescript-strongly-typed-backbone-models/