我有几个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实例的类的最佳方法吗?
答案 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/