Uma maneira melhor de estender visualizações e modelos de backbone

Embora o Backbone tenha algum nível de suporte à herança de objeto, ele serve apenas para estender suas próprias Classes e nada mais. Quando você deseja usar um modelo ou visualização já existente como base para seus novos objetos estendidos, o método de extensão padrão geralmente falha.

Por exemplo, você não tem como usar os métodos da classe Parent em sua classe Child e se quiser estender os padrões de um Model já existente ou eventos de View, você terá que chamá-los via prototypee estendê-los ou reescrevê-los para sua classe infantil novamente.

Para resolver esses problemas, criei um novo método rápido para visualizações e modelos. Ele estende automaticamente defaultse eventsatribui para você e define uma _superpropriedade que você pode fazer referência com segurança à sua classe Parent e usar seus métodos enquanto os sobrescreve.

Aqui está o código:

(function(Model){
'use strict';
// Additional extension layer for Models
Model.fullExtend = function (protoProps, staticProps) {
// Call default extend method
var extended = Model.extend.call(this, protoProps, staticProps);
// Add a usable super method for better inheritance
extended
.prototype._super = this.prototype;
// Apply new or different defaults on top of the original
if (protoProps.defaults) {
for (var k in this.prototype.defaults) {
if (!extended.prototype.defaults[k]) {
extended
.prototype.defaults[k] = this.prototype.defaults[k];
}
}
}
return extended;
};

})(Backbone.Model);

(function(View){
'use strict';
// Additional extension layer for Views
View.fullExtend = function (protoProps, staticProps) {
// Call default extend method
var extended = View.extend.call(this, protoProps, staticProps);
// Add a usable super method for better inheritance
extended
.prototype._super = this.prototype;
// Apply new or different events on top of the original
if (protoProps.events) {
for (var k in this.prototype.events) {
if (!extended.prototype.events[k]) {
extended
.prototype.events[k] = this.prototype.events[k];
}
}
}
return extended;
};

})(Backbone.View);

E aqui está um exemplo de como usá-lo com modelos, o mesmo se aplica para visualizações também

 var Car = Backbone.Model.extend({
defaults
:{
engine
: 'gasoline',
hp
: 0,
doors
: 4,
color
: 'generic'
},
engine
: function(){
return 'Wroomm';
}
});

// Ferrari will have all attributes from Car Model
// But will also have it's own modifications
var Ferrari = Car.fullExtend({
defaults
: {
hp
: 500,
color
: 'red',
doors
: 2
},
// Engine method can use the engine method on Car too
engine
: function(){
var ret = this._super.engine();
return ret + '!!!!';
}
});

Espero que seja útil para você.