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 prototype
e 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 defaults
e events
atribui para você e define uma _super
propriedade 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ê.